1. 로그아웃 핵심
1. 브라우저의 jsessionId를 삭제 2. 서버측 세션에 jsessionId의 영역을 삭제 ← 서버측에서 할 수 있는 것 3. 30분 동안 reqeust 요청이 없으면 로그아웃
서버 측에서 session을 무효화 시켜버리면 서랍의 내용이 날아간다
리퀘스트, 세션 → 톰캣 영역 (톰캣에서 뜸)
세션 → HashMap
2. 세션 저장소 내부
해시맵 안의 값이 또 다른 해시맵으로 구성되어 있다. 세션에 "name"이라는 키로 값을 1로 설정하는 코드인 session.setAttribute("name", 1);은 로그인 인증을 위해 SessionUser라는 키값에 사용자 객체가 필요하다. 로그인 인증을 위해 SessionUser라는 키값에 user 객체가 있어야 하는 이유는 사용자 정보를 식별하기 위해서! (= SessionUser라는 키 값에 user객체가 있어야지 로그인 인증이 된다.) 이제부터는 사용자 객체를 1, 2와 같은 값으로 받을 예정이다. 그럼, 이제 user 객체가 없어도 이전에 받아온 사용자 객체를 1, 2 와 같은 값을 기반으로 '어? 아까 왔던 걔네?' 하고 인식할 수 있다.
3. jsessionId의 여행
1. 클라이언트(브라우저)가 request요청을 하면 서버는 특정 조건에 따라 jsessionId 영역을 만든다 2. 서버(스프링)가 response 응답을 할 때, response header에 Set-cookie 키 값에 jsessionId를 담아서 전달한다. 3. 클라이언트(브라우저)는 Set-Cookie의 값을 브라우저의 쿠키 저장소에 저장한다 4. 클라이언트가 다시 request 요청을 하게 되면, request의 header에 cookie 키 값에 jsessionId를 담아서 요청 5. 서버는 jsessionId를 확인해서 아까 왔던 사람인지 체크만 한다. (Stateful이라고 한다) 6. Stateful은 클라이언트의 상태를 서버 측에 저장하는 것
서랍이 jsessionId
4. 로그아웃 로직 구현
<a> 태그는 GET요청이다!!
[ 로그아웃 코드 ]
@GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; }
세션 저장소 유효 기간 설정 → 트랜젝션까지 하고 하기?
세션 저장소의 유효기간은 보통 30분이다 메모리를 다 잡아먹고 있으니까 이걸 방지하기 위해서 아무도 이 세션서랍을 찾지않으면 날아가게 설정한다. 보통은 web.xml에서 설정하지만 우리는 application.yml에서 설정할 것이다 (web.xml을 다룰 일이... 없다)
세션 시간 30분 연장하는 설정
[ session.invalidate();의 역할 ]
저렇게, 세션 자체를 팍! 없애버리는 것! 서랍 비우기! session.invalidate(); !!
톰캣의 Scope 2가지 (session, request)
1. 브라우저의 jsessionId를 삭제 2. 서버측 세션에 jsessionId의 영역을 삭제 ← 서버측에서 할 수 있는 것 3. 30분 동안 reqeust 요청이 없으면 로그 아웃
[ 생명 주기 ]
request < session < application
* 그러나.. application은 기억할 필요x 환경변수를 끌어와서 쓰는게 더 낫다
* request의 생명 주기는 응답(response) 후 날아가버려서 짧음
* session의 생명 주기는 로그아웃 핵심에 적힌 1~3번과 같다.
Share article