정의 : 웹 브라우저와 웹 서버 간의 상태 정보를 저장하고 교환하기 위해 사용하는 작은 데이터 파일
1. 사용법
1. 생성
1) new Cookie(쿠키이름 , 값)을 통해 생성
2) Cookie.setMaxAge(60);를 통해 시간을 넣어줄 수 있으며, 값이 없을 시 브라우저 종료 시 해제된다.
3) response 응답에 넣어준다.Cookie idCookie = new Cookie("memberId", loginMember.getId().toString()); idCookie.setMaxAge(60); response.addCookie(idCookie);2. 검증
1)@CookieValue(name , required)를 통해 쉽게 검증 할 수 있다.
1-1) name : 요청 쿠키 중 가져올 쿠키의 이름을 지정합니다.
1-2) require : if true일 경우 요청에 없을 시 예외가 발생하며, false일 경우 예외가 발생하지 않고 바인딩 값이 null로 처리된다.@GetMapping("/welcome") public String welcome(@CookieValue(name = "memberId", required = false) String memberId) { if (memberId == null) { return "No member ID found"; } return "Welcome, Member ID: " + memberId; }
정의 : 클라이언트의 중요한 정보를 저장하는 기능이며, 사용자와의 연결 상태를 유지하는 데 활용됩니다.
1. 세션 생성 시
대략적으로 세션 생성 시 내부적으로 쿠키를 생성할 때 쿠키의 value값의 UUID를 담으며, 서버쪽에서 map에 key는 UUID value는 로그인 데이터를 담게된다. 이 UUID를 통해 서버에서 해당 값을 확인하고 연결 상태를 유지한다.
private Map<String,Object> sessionStore = new ConcurrentHashMap<>(); /** * 세션 생성 */ public void createSession(Object value, HttpServletResponse response){ String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId,value); Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); response.addCookie(mySessionCookie); }2. 사용법
1. 생성
1) HttpServletRequest.getSession(boolean create)을 통해 세션을 생성한다. - 서블릿 지원
1-1) create 옵션
true 일 경우 : 세션이 있으면 기존 세션을 반환하며, 없을 경우 새로운 세션을 생성해서 반환해준다. (default)
false 일 경우 : 세션이 있으면 기존 세션을 반환하며, 없을 경우 세션을 생성하지 않는다(null 반환)
2) session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);를 통해 세션 데이터를 저장한다.
2-1) 하나의 세션에 여러 데이터를 저장할 수 있다.//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성 HttpSession session = request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);2. 조회
1) request.getSession(false)를 통해서 조회
HttpSession session = request.getSession(false); if (session == null) { return "home"; } Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); //세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; }2) @SessionAttribute 를 통해서 조회 (이 경우는 세션을 생성시키지 않는다.)
public String homeLoginV3Spring ( @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember ) { //세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } }3. 세션 삭제
public String logoutV3(HttpServletRequest request) { //세션을 삭제한다. HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } return "redirect:/"; }3. 세션 타임아웃 설정
세션은 사용자가 로그아웃을 직접 호출해서 session.invalidate()가 호출 되는 경우에 삭제된다. 그런데 대부분의 사용자는 로그아웃을 선택하지 않고, 그냥 웹 브라우저를 종료한다. 문제는 HTTP가 비 연결성(ConnectionLess)이므로 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지를 인식할 수 없다.
따라서, 서버에서 세션 데이터를 언제 삭제 할 것인지에 대한 대안이 필요하다.만약 삭제 안할 시 발생 문제
- 메모리에 기본적으로 세션이 생성됨으로 삭제를 안해 줄 시 메모리 문제가 발생한다.
- 세션과 관련된 쿠키(JSESSIONID)를 탈취 당했을 경우 오랜 시간이 지나도 해당 쿠키로 악의적인 요청을 할 수 있다.
HttpSession에서 세션 종료 시점을 정하는 방식
사용자가 서버에 최근에 요청한 시간을 기준으로 지정된 시간을 유지해주는 방안을 사용한다.
세션 타임아웃 시간 설정
application.properties 에
server.servlet.session.timeout=60 (60초, 기본은 1800(30분)) 설정