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 객체에 사용자 정보의 일부를 담는다.
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의 유효기간이 있어 바로 뙇 할수는 없다...!!
'나의 개발 기록 > etc' 카테고리의 다른 글
구글 text-to-speech(TTS) API 적용 (feat. Javascript) (2) | 2023.04.28 |
---|---|
[iBatis] iBatis 사용법과 사용예제 (0) | 2023.04.14 |
이클립스 인코딩 (한글깨짐, 한글깨질 때 해결방법) (0) | 2023.02.21 |
[JS, JSTL] URL주소에 있는 파라미터 가져오는 방법 (0) | 2022.10.26 |
댓글