![[블로그 만들기] 11. 로그아웃 구현 : SessionID](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255B%25EB%25B8%2594%25EB%25A1%259C%25EA%25B7%25B8%2520%25EB%25A7%258C%25EB%2593%25A4%25EA%25B8%25B0%255D%252011.%2520%25EB%25A1%259C%25EA%25B7%25B8%25EC%2595%2584%25EC%259B%2583%2520%25EA%25B5%25AC%25ED%2598%2584%2520%253A%2520SessionID%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3DCoding_study&w=2048&q=75)
핵심
- 브라우저의 쿠키의 jsessionID 삭제
- 서버측 session에 jsessionID의 영역을 삭제
session을 무효화시키면 서랍의 내용이 날아감
- 30분 동안 request 요청이 없으면 로그아웃


1. 세션(Session)
- 서버와 클라이언트 간의 상태를 유지하는 메커니즘
- 사용자의 웹 브라우저와 서버 간에 유지되는 상태 정보
Tomcat 실행시 뜸 / 해쉬 맵이라고 생각하기
서랍 안에 왼쪽은 key, 오른쪽은 value (내부도 해쉬 맵 → 여기 저장하는 것이 인증)
jsessionID, F3F73684A02B3A978E1A297CD7FC1D77
외부에서도 jsessionID를 가지고 와서 요청을 함
- 일반적으로 사용자가 웹 애플리케이션에 로그인할 때 시작
로그아웃 OR 일정 시간이 지난 후에 종료
- 서버 측에 데이터를 저장
SessionID가 담긴 쿠키를 전송해서 세션을 유지
2. 쿠키(Cookie)
- 클라이언트 측에 정보를 저장하는 작은 데이터 조각
- 브라우저는 서버로부터 받은 쿠키를 저장
이후 해당 도메인의 요청 시에 쿠키를 함께 전송
- 쿠키에는 만료 기간이 있어 일정 시간 동안만 유지 가능
3. Set-Cookie 헤더
- 서버가 클라이언트에게 쿠키를 설정하도록 지시하는 HTTP 헤더
- 서버는 Set-Cookie 헤더를 사용
클라이언트에게 쿠키의 이름, 값, 만료 날짜 및 경로 등을 전달
- 클라이언트는 받은 쿠키를 저장
이후 해당 도메인에 요청할 때마다 쿠키를 함께 보냄
4. jsessionID
- 클라이언트(브라우저)가 request 요청을 하면 서버는 특정 조건에 따라 jsessionId 영역을 만든다.
- 서버(스프링)가 response 응답을 할 때 response header에 Set-Cookie 키 값에 jsessionId를 담아서 전달한다.
- 클라이언트(브라우저)는 Set-Cookie의 값을 브라우저의 쿠키 저장소에 저장한다.
- 클라이언트 다시 request 요청을 하게 되면, request의 header에 cookie 키 값에 jsessionId를 담아서 요청
- 서버는 jsessionId를 확인해서 아까 왔던 사람인지 체크만 한다. (StateFul이라고 한다)
- Stateful은 클라이언트의 상태를 서버측에 저장하는 것
5. 로그인 해서 jsessionID확 인하기



6. SessionID의 유무로 로그인 상태 확인하기
- HttpSession 참조하는 객체 선언하기
- sessionID가 있으면 로그인 된 상태이고
없으면 로그인이 안된 상태

7. BoardController에 index()에서 session 값으로 로그인 상태 확인하기
package shop.mtcoding.blog.board; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import jakarta.servlet.http.HttpSession; import shop.mtcoding.blog.user.User; @RequiredArgsConstructor @Controller public class BoardController { // HttpSession 객체를 참조 private final HttpSession session; @GetMapping({ "/", "/board" }) public String index() { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { System.out.println("로그인 안된 상태입니다"); }else { System.out.println("로그인 된 상태입니다"); } return "index"; } @GetMapping("/board/saveForm") public String saveForm() { return "board/saveForm"; } @GetMapping("/board/1") public String detail() { return "board/detail"; } }


Share article