본문 바로가기
  • 평범한 나의 개발공부 일지
나의 개발 기록/etc

session + cookie VS JWT

by 블랑 블랑 2022. 8. 30.
반응형

 

session + cookie

 

 

 

 

* 2명의 사용자가 로그인을 하여 session저장소에 2개의 정보가 저장이 됐을때

sessionID  (키) value (값)
asssDSddfDGg a@aaa.co.kr
NbInNkBbdsksl b@bbb.co.kr
   

 

매 페이지마다 request 보낼경우

브라우저 쿠키에 담겨있는 sessionID를 보내야

그 sessionID에 해당하는 세션을 가져올수 있음 ( session.getAttribute(sessionID)  )

 

 

 

 

 

session + cookie vs JWT

 

1. session + cookie

 

단점

- 저장공간의 용량 (서버의 메모리에 저장되기때문에 양이 많아지면 과부하가 올수 있음)

- 확장성의 문제 (서비스의 규모가 커져서 서버를 여러대로 확장 및 분산해야 한다면 세션을 분산시키는 기술을 따로 설계해야 한다.)

 

이 두가지 인데 이 문제를 해결하기위해서 JWT를 쓴다고 한다. 

하지만 나의 프로젝트는 저장공간이나 확장성의 문제가 발생할 환경이 아님.

 

 

 

그래도 JWT가 어떻게 돌아가는지는 알아봐야할 것 같다.

 

 

 

 

2. JWT

- 전통적인 쿠키 세션 방식과 다르게 json 객체에 사용자 정보의 일부를 담는다.

JSON Web Tokens - jwt.io

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

 

 

구조

 

1. header 

- 디코딩해보면 토큰타입=JWT (고정값) , alg = 3번서명값이 들어갈 알고리즘(hs256)

2. payload 

- base64로 디코딩해보면 JSON형식으로 되어있음. 여러정보들이 담겨있음

3. signature

 

 

인가 과정

① 서버는 request할때 토큰값이 실려들어오면 

② 1번 header + 2번 payload + 서버에 감춰놓은 값(?) 을 암호화 알고리즘에 넣고 돌린다

③ 3번 서명값과 일치한다 ? + 토큰의 유효기간이 안지났다 = 인가 성공!

>>> 만약 2번 payload의 정보가 서버가 아닌 누군가에 의해 조작되면 3번 서명값과 일치하지 않게되기때문에 거부 !

 

장점

JWT를 이용하면 서버가 클라이언트한테 토큰 한번만 생성해서 주면 

클라이언트는 그 토큰을 보관하고 있다가 request시마다 헤더에 토큰을 실어서 보내기만 하면된다

session+cookie방식은  request시마다 쿠키를 실어서 보내는것까지는 비슷하지만

서버에 있는 세션저장소를 이용한다는 점에서 차이가 있는 것 같다.

그런점에서 jwt가 좀더 간편하다 (?)

 

 

단점

일단 로그인을 하면 보통  access token이랑 refresh token 2가지의 토큰을 발급하는데

  • Access Token (유효기간이 짧음) > 쿠키에 저장 
  • Refresh Token (유효기간이 김)    > 쿠키에 저장, 서버측 db에 저장

그래서 access token이 만료되면 서버에 저장된 토큰으로 비교한다음 맞으면 새로운 acces token을 발급해준다

그렇기 때문에refresh token가 유효할동안은 access token이 만료되도 다시 로그인안해도 유지를 할 수 있는것!!

 

무튼 

session+cookie방식은 예를들어 쿠키 또는 토큰이 악의적으로 사용되면 쿠키를 삭제 하면 끝이지만

JWT는 토큰의 유효기간이 지나기 전까지는 사용할수있기때문에 마음대로 삭제를 할 수 가 없다. 제어가 불가능한것이다

 

하지만 refresh token을 서버에서 그냥 삭제해버릴 수 는 있지만

그래도 access token의 유효기간이 짧게라도 남아있기때문에 아예 바로 차단할 방법은 없다고 한다... 

 

같은 예로 

한기기에서만 로그인을 가능하도록 구현하고싶다?

근데 세션은 사용자의 상태를 다 저장해서 사용자들의 상태를 다 제어 가능하기때문에

PC에서 로그인했어도 다시 핸드폰으로 로그인했을경우 PC에서 로그아웃되도록 제어가 가능한데

JWT는 그럴 수 없다.......

마찬가지로 위에방법처럼 보완할수는있지만 access token의 유효기간이 있어 바로 뙇 할수는 없다...!!

 

 

반응형

댓글