블로그 만들기 11. 로그아웃 구현 : SessionID

Feb 05, 2024
블로그 만들기 11. 로그아웃 구현 : SessionID

💡
핵심
  • 브라우저의 쿠키의 jsessionID 삭제
  • 서버측 session에 jsessionID의 영역을 삭제
session을 무효화시키면 서랍의 내용이 날아감
  • 30분 동안 request 요청이 없으면 로그아웃
notion image

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확 인하기

notion image
notion image
notion image
 

6. SessionID의 유무로 로그인 상태 확인하기

  • HttpSession 참조하는 객체 선언하기
  • sessionID가 있으면 로그인 된 상태이고
없으면 로그인이 안된 상태
notion image
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"; } }
notion image
 
Share article
RSSPowered by inblog