inblog logo
|
vosw1
    Spring

    블로그 만들기 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

    vosw1

    RSS·Powered by Inblog