회고/코드스쿼드 - Java 과정

[TIL] 코드스쿼드 2022 백엔드 56일차 회고(12주차)

jwKim96 2022. 3. 29. 01:59

오늘은 무슨 일이?

이번주도 루시드와 페어프로그래밍을 계속합니다.
저번주 금요일에 웹서버 3단계 미션 구현은 끝내놓아서, 오전에 빠르게 readme 작성을 마쳤습니다.
그리고 4단계를 잠시 구현하다보니 어느새 점심시간이 되어, 오전이 순삭되었네요.

오늘 오후는 원래 2시~4시 호눅스의 수업이 있었는데, 컨디션이 안좋으셔서 내일로 미뤄졌습니다.
그래서 오후에도 페어프로그래밍을 하게되었는데, 시작전에 잠깐 담소를 나눈다는게 30분이나 애기를 해버렸습니다 ㅋㅋㅋ
요즘 키보드가 말썽이라 새로운 키보드를 물색중인데, 마침 루시드가 한성 GK993B 키보드를 추천해주셨습니다.
안그래도 저는 조용한 키보드를 좋아하는데 이 키보드는 저소음 적축 키보드라 관심이 갔습니다 ㅎㅎ

4단계 도중 잠깐 삽질이 있었는데, 그래도 시간을 많이 소모하지는 않고 해결해내고 결국 구현해냈습니다.
그러던 중 HTTP Cookie 에 대해 잘 몰랐던 사실 한가지를 알게되었습니다.

HTTP Cookie 의 Path

로그아웃 기능 구현 중 브라우저 캐시를 지우기 위해 다음과 같은 응답 헤더를 보냈습니다.

set-Cookie: sessionId=abc; Max-age=0;

그러나 쿠키가 제거되지 않았는데, 그 이유는 path 를 지정해주지 않았기 때문입니다.
아시다시피 쿠키제거되는 데이터가 아니라, 만료되는 데이터 입니다.
그래서 위 처럼 만료 기한을 정해서 없어지도록 설정해야하는데, 그러기 위해서는 특정 쿠키 데이터를 정확히 지정해야합니다.

쿠키 데이터는 domain, path, name 를 복합키처럼 사용하여 데이터를 특정하는데요.
만약 Path 를 지정하지 않으면 현재 경로를 기준으로 Path 가 설정됩니다.
그래서 set-Cookie: sessionId=abc; 라는 가정하에 요청 URL 에 따라 다음과 같이 지정합니다.

  http://localhost:8080/user/login http://localhost:8080/user
name sessionId sessionId
value abc abc
domain localhost localhost
path /user /

위 표처럼 Path 가 다르기 때문에 두 쿠키 데이터는 서로 다른 테이터로 관리됩니다.
그래서 set-Cookie 를 할때 Path 를 꼭 신경써야합니다.

여기서 한가지 궁금증이 들었는데 쿠키 의 Path 가 지정되어있지 않으면 어떻게 처리되는지 궁금했습니다.

그래서 먼저 Spring 공식 문서를 찾아보니 Cookie Resolver 를 사용한다면 기본으로 cookiePath 를 / 로 지정해주지만,
Cookie 관련 커스텀 설정을 해야 사용되는 클래스이기 때문에 스프링에서 기본적으로 쿠키 의 Path 를 지정해주진 않는 것 같았습니다.

다음으로는 javax.servlet.http.Cookie, javax.servlet.http.HttpServletResponse 클래스를 확인해봤습니다.
먼저 Cookie 클래스 내부에서는 path 는 사용자가 설정한 값만 가지도록 되어있었습니다.
그 다음으로는 HttpServletResponse 를 살펴보려했는데 인터페이스라서 어떤 구현체를 주입해주는지 확인해야 했습니다.
그래서 디버깅해보니 런타임에 org.apache.catalina.connector.ResponseFacade 라는 객체가 주입되는게 확인되었습니다.
하지만 이 클래스 또한 path 를 default 로 처리하는 로직은 없었습니다.

그래서 아무런 설정을 하지 않는다면 똑같이 현재 경로를 기준으로 설정한다고 결론짓고, 마지막으로 실제 테스트를 해봤습니다.

@GetMapping("/cookie")
public String cookie(HttpServletResponse response) {
    response.addCookie(new Cookie("hello", "world"));
    return "index";
}

@GetMapping("/hello/cookie")
public String helloCookie(HttpServletResponse response) {
    response.addCookie(new Cookie("world", "hello"));
    return "index";
}

위 처럼 Path 를 지정하지 않으면 현재 요청 URL 경로에 따라 자동으로 지정되기 때문에,
요청 URL에 관계없이 전역으로 사용할 쿠키가 있다면 Path 설정에 유의해야할 것 같습니다.

인상깊었던 점은?

  • Cookie Path 의 중요성

아쉬웠던 것은?

  • Cookie 를 파는데 너무 많은 시간을 쏟았나... 싶습니다