개발

session, cookie, jwt 관계 및 정리

changha. 2023. 7. 1. 16:59

jwt 로그인 방식을 공부하는 도중에 session에 대해 알게 되었고

jwt 사용할 때 session을 안쓰는 이유에 대해 궁금해서 이 참에 용어 정리하려고 합니다

 

//SecurityConfig.class 의 SecurityFilterChain 메서드 중...

//session 사용하지 않음
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

 

SessionCreationPolicy.ALWAYS - 항상 세션 생성 

SessionCreationPolicy.IF_REQUIRED - 필요시 생성(기본) 

SessionCreationPolicy.NEVER  - 생성하지 않지만, 기존에 존재하면 사용

SessionCreationPolicy.STATELESS     - 스프링시큐리티가 생성하지도않고 기존것을 사용하지도 않음
                                                                 -> JWT사용할 때 쓰임 

 


1. Session 이란?

방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라 합니다.

웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법을 의미합니다. 

사용자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 종료할 때까지를 하나의 상태로 봅니다. 

 

 

1-1 작동 방식 

Session flow

1. 사용자가 로그인 정보와 함께 login 요청을 함

2. 서버에서 login 정보를 확인하고 세션 객체를 생성 후 클라이언트쪽에 sessionId를 Cookie에 담아서 보냄(세션 객체는 서버에 저장)

3. 클라쪽에서 서버에 작업을 요청할 때 요청 헤더에 cookie(sessionId)를 함께 전송함 

4. 서버에서는 받은 세션Id를 이용하여 세션 객체를 검색하고 정보가 있으면 응답해줌

 

2. Cookie란?

클라이언트에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다. 

쿠키를 이용하여  필요할 때 정보를 참조하거나 재사용할 수 있습니다.

 

보통 쇼핑몰의 장바구니, 개인 설정(팝업창 표시여부 등) 같은 경우에 많이 사용됩니다. 

 

2-1 작동방식 

이미지 출처 : https://interconnection.tistory.com/74

1. 클라이언트가 서버에 로그인 request

2. 서버는 DB에서 로그인 정보를 찾고 Cookie를 생성하여 response

3. 클라이언트가 Cookie와 함께 request

4. 서버는 해당 Cookie로 누구인지 식별가능 하고 response 

 

3 jwt란?

Json Web Token의 약자로 세션방식과 유사하게 token에 사용자를 인증할 수 있는 여러 정보를 실어서 클라에게 보내줍니다.

 

3-1 JWT의 구성요소 

이미지 출처 : https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

- header : 어떠한 알고리즘으로 암호화 할 건지, 어떤 토큰을 사용할 것인지에 대한 정보

- payload : 전달하려는 데이터를 담는 공간 

-signature : header와 payload 그리고 secret key로 구성된 문자열을 정해진 알고리즘으로 hashing한 값 

 

 

3-2 작동방식 

출처 : https://80000coding.oopy.io/1f213f10-185c-4b4e-8372-119402fecdd0

1. (세션과 동일) 클라이언트가 서버에게 로그인 요청을 함

2. 로그인 정보가 유효하다면 서버에서 json형식으로 된 토큰을 발행 

3. JWT를 클라이언트로 보냄(헤더 or 쿠키 등을 통해)

4. 클라이언트는 토큰을 어딘가(세션 스토리지 or 로컬스토리지 등)에 저장해놓고 요청시마다 함께 서버로 보냄

5. 서버에서는 토큰을 해독해서 만료시간이 지났는지, 사용자가 맞는지 확인을 함 

6. 클라이언트에게 응답을 보냄