로그인 상태를 유지하도록 해주는 것이 바로 쿠키로, 로그인 성공시 생성한 쿠키를 쿠키 저장소에 저장하고, 이 후에는 쿠키 저장소에서 해당 사용자의 쿠키를 조회하여 사용하게 된다.
쿠키에는 영속 쿠키와 세션 쿠키가 있다.
Cookie cookie = new Cookie("쿠키 ID", String.valueOf(value));
cookie.setMaxage(60);
cookie.setPath("/");
response.addCookie(cookie);
setMaxage
: 쿠키의 유효 기간 설정 (설정 X → 세션 쿠키 ) setPath("/")
: 쿠키의 허용 경로 설정response.addCookie(쿠키 객체)
: 응답정보에 쿠키정보 추가로그인에 성공하여 쿠키를 생성하게 되면 HttpServletResponse
에 쿠키를 포함시킨다.
@CookieValue
사용하여 쿠키를 편리하게 조회할 수 있다.
쿠키의 정보를 통해 로그인 기능을 구현하였다면, 로그아웃 기능 역시 쿠키를 사용해 구현할 수 있다.
Cookie cookie = new Cookie("쿠키 ID", null);
cookie.setMaxage(0);
response.addCookie(cookie);
위와 같이 응답 쿠키를 생성하면 해당 쿠키 ID는 즉시 종료된다.
쿠키를 통해 사용자 ID를 전달하여 로그인을 유지할 수 있다.
하지만 클라이언트가 쿠키를 임의로 변경하게 되면 다른 사용자의 ID에 접근할 수 있는 보안 문제가 발생한다. 추가에 쿠키에 저장된 개인정보 혹은 금전적 정보가 담겨있으면 문제는 더 커지게 된다.
대안으로 바로 쿠키에 중요한 값을 노출시키지 않고, 임의의 토큰을 노출하는 것이다. 또한, 토큰이 탈취당하더라도 설정 시간이 지나면 만료하는 방법도 있다.
결국 중요한 정보는 서버에 저장해야 하며, 클라이언트와 서버는 랜덤한 식별자 값으로 연결해야 한다. 이렇게 서버에 중요한 정보를 저장하고 연결을 유지하는 방법을 세션이라 한다.
sessionId
는 추정 불가능한 값(UUID
)으로 생성
생성된 sessionId
와 세션에 보관할 value
을 서버의 세션 저장소에 보관
클라이언트는 요청시 항상 mySessionId
쿠키를 전달
서버에서는 전달한 쿠키 정보로 세션 저장소를 조회해 로그인시 보관한 세션 정보를 사용
서블릿이 제공하는 HttpSession
을 생성하면 쿠키 이름이 JSESSIONID
, 추정 불가능한 랜덤 값의 쿠키를 생성한다.
HttpSession session = request.getSession(false);
HttpSession session = request.getSession(true);
getSession(false)
: 세션이 있으면 해당 세션 반환, 없으면 null
반환
getSession(true)
: 세션이 있으면 해당 세션 반환, 없으면 신규 세션 반환
세션을 삭제할 때는
session.invalidate()
, 로그아웃 기능에 활용
스프링은 세션을 더 편리하게 사용할 수 있도록 @SessionAttribute
지원
이 기능은 세션을 생성하지 않기에 이미 로그인된 사용자를 찾을 때 사용하면 유용하다.
@SessionAttribute(name = "loginUser", required = false) User user
찾은 세션에 들어있는 데이터를 찾는 번거로운 과정을 스프링이 처리한다.
처음 로그인시 URL에
JSESSIONID
가 노출된다.
이는server.servlet.session.tracking-modes=cookie
옵션을 추가함으로 해결할 수 있다.
보통 글로벌 설정을 통한 타임아웃 설정과 특정 세션 단위로 시간 설정이 가능하다.
글로벌 설정 시간 설정 : server.servlet.session.timeout=1800
(글로벌 설정은 분 단위로 설정)
특정 세션 단위의 시간 설정 : session.setMaxInactiveInterval(1800);
실무에서 주의할 점으로는 세션의 시간을 너무 길게 잡으면 메모리 사용의 누적으로 장애가 발생할 수 있다. 기본이 30분이라는 것을 기준으로 해결해보자 !
지금까지 정리한 쿠키와 세션을 비교해보자.
📌 본 포스트는 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.