Cookie cookie = new Cookie(cookieName, null);
cookie.setMaxAge(0);
response.addCookie(cookie);
cookie.setMaxAge(0);
중요한 정보를 쿠키에 넣으면 안되고 서버가 가지고 있어야함
클라이언트 - 서버는 임의의 식별자 값으로 연결해야함
세션이란?
서버에 중요한 정보를 보관하고 연결을 유지하는 방법
Cookie: mySessionId=zz0101xx-bab9-4b92-9b32-dadb280f4b61
정리
- 쿠키 값 변조 위험 → 예측 불가, 복잡한 세션 ID 사용
- 쿠키 값 탈취 위험 → 세션 ID에는 중요한 정보가 없음
- 쿠키 탈취 후 사용 → 쿠키 만료시간을 짧게 혹은 강제 제거
서블릿이 공식 지원하는 세션과 우리가 직접 만든 세션의 동작방식은 거의 같다.
서블릿은 HttpSession
이라는 기능을 제공한다.
HttpSession
과 우리가 만든 SessionManager
는 같은 방식으로 동작
서블릿을 통해 HttpSession
을 생성하면 다음과 같은 쿠키를 생성함
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
request.getSession(true)
(true 빼도 됨)
request.getSession(false)
session.setAttribute(..)
와 request.setAttribute(..)
는 비슷하고, 하나의 세션에 여러 값을 저장할 수 있다.
session.invalidate()
: 세션 제거
스프링이 제공하는 어노테이션으로
@SessionAttribute(name = "loginMember", required = false) Member loginMember
간단하게 사용할 수 있다.
로그인 처음 시도 시 url은 jsessionid를 포함한다.
http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872
application.properties
server.servlet.session.tracking-modes=cookie
sessionId
: JSESSIONID
값maxInactiveInterval
: 세션 유효시간creationTime
: 세션 생성일시lastAccessedTime
: 최근 접근 시간, 클라이언트가 서버로 sessionId
를 요청한 경우 갱신isNew
: 새로 생성된 세션인지, 과거에 만들어져 클라이언트가 서버로 요청해서 조회된 세션인지 여부application.properties
server.servlet.session.timeout=60
60초, 기본은 1800(30분)이며 글로벌 설정은 분 단위로 설정해야함
특정 세션 단위로 시간 설정은 session.setMaxInactiveInterval(1800)
사용
세션 타임아웃 시간은 JSESSIONID
를 전달하는 요청이 있으면 현재 시간으로 다시 초기화된다. LastAccessedTime
이후로 Timeout 시간이 만료되면 WAS가 내부에서 해당 세션을 제거한다.
정리
- 실무에서는 세션에 최소한의 데이터만 보관해야함
- 데이터용량 * 사용자 수로 메모리 사용량이 커지면 장애 발생
- 세션 시간을 길게 가져가면 메모리 사용량 누적되므로 적당한 시간 설정할 것