JWT 의 특징: Stateless
jwt 방식은 Stateless하다.
Stateful은 상태를 유지하고 관리하는 방식이고, 사용자의 로그인 상태를 데이터 베이스에 저장하고 해당 상태를 조회하는 경우에는 Stateful하다고 볼 수 있다.
하지만 Stateless는 어떨까?
- JWT 방식을 생각하면, 사용자의 정보 가운데 민감한 정보가 아닌 정보로 JWT Claim 를 꾸리고 암호화 해 클라이언트에 반환한다. 또한 이 토큰을 확인하기 위해 서버는 서명 부분을 확인해 JWT 알고리즘을 굴려서 해당 토큰이 조작되었는지 판별하고, 조작되지 않았다면 JWT 알고리즘을 굴려 토큰으로부터 사용자의 아이디와 같이 식별할 수 있는 정보를 꺼내서 사용한다.
- 세션 방식을 생각해보자. 서버는 세션 데이터 베이스에 사용자의 정보를 저장하고, 생성된 세션 아이디를 쿠키에 넣어 클라이언트에 반환한다. 클라이언트가 세션 id를 포함한 쿠키를 서버에 전달하고, 서버는 쿠키에서 세션 아이디를 꺼내 세션 데이터 베이스에 해당 아이디에 해당하는 레코드가 존재하는지 조회한 후, 존재하지 않으면 로그인이 되어있지 않다고 판단한다.
이렇게 보면, JWT는 데이터베이스에서 저장하고 조회한다는 과정이 포함되지 않는다. 따라서 JWT는 stateless한것이다.
하지만 Stateless하기만 한 방식으로는 안전한 로그아웃을 구현할 수 없다.
서버는 토큰을 발급한 후에, 그 뒤로는 토큰에 대한 제어를 완전히 잃어버리기 때문이다. 어딘가에 내가 발급한 토큰도, 클라이언트에 토큰을 발급했다는 정보도 저장해두지 않는다.
따라서 Refresh token은 서버에 저장되어야 하며, 유효성을 검증하고 새로운 Access Token을 발급하는 과정이 필요하다.
블랙 리스트 테이블을 사용한 Refresh Token (Stateless + Stateful)
로그아웃한 사용자의 Refresh Token을 블랙 리스트 역할을 하는 데이터 베이스에 저장한다. (블랙리스트: 무효화된 토큰을 저장하는 테이블 )
이 방식을 사용할 경우에, 클라이언트가 로그아웃 할 경우에 프론트엔드 코드에서 직접 Access Token을 삭제해주면 된다. 만약, 토큰이 탈취 되더라도 만료 기간을 짧게 설정해 두면 안전하다.
또, Access Token이 만료된 경우에 Refresh Token을 통해 재발급 받으면 되기 때문에 너무 자주 로그인이 풀리는 것도 방지한다.
로그아웃 시에 블랙 리스트 테이블에 Access Token도 저장한다면?
➡️ Access Token이 탈취되었더라도, 블랙리스트에 저장해 버리면, 해당 Access Token으로 오는 요청을 거절할 수 있게 된다.
하지만 세션 방식과 다를 바 없게 된다. 따라서 기각...
그래서! 내가 생각한 우리 백엔드 루트(?)
1. 프론트엔드에서 access Token 요청을 보낸다.
- 헤더에 있는 AccessToken을 까본다!
- 만료가 되었는지 확인한다. (JWT Filter 작동)
- 만료가 되었으면 요청이 실패된다!
- 토큰이 만료되어서 요청 실패됐다는 코드를 보낸다! ( 코드는 몇으로 할지 고민중.. 이것도 커스텀이 되나? 되겠지)
2. 프론트엔드에서 Refresh Token을 포함해서 재발급 요청을 한다.
- Refresh Token이 유효한지 확인한다.
- 이미 로그아웃 된 사용자의 토큰이 아닌지, 즉 Black_List 테이블에 있는지 확인한다.
- 현재 요청을 보내는 사용자의 토큰이 맞는지( = 함께 받은 access Token에서 추출한 id와 Refresh Token에서 추출한 id가 동일한지 검증한다.)
3. 2에서 진행한 결과 맞다면 새롭게 발급한 Refresh Token과 Access Token을 클라이언트로 보내준다.
로그아웃 루트
로그아웃 시 클라이언트에서 Refresh Token과 Access Token을 같이 보낸다. -> Access Token과 Refresh Token을 검증한다. -> 이상 없으면 로그아웃 시켜준다. -> BlackList에 로그아웃한 사용자의 리프레쉬 토큰을 추가한다.
재발급 요청 루트 (Access Token 만료 시)
클라이언트에서 Refresh Token을 보낸다. -> 검증한다. -> 문제가 없으면 새로 Access Token과 Refresh Token을 발급해준다.
한 번 해보쟈잇 👾
'SCHOOL > 캡스톤' 카테고리의 다른 글
[졸프 백엔드] [버그 수집] logout 시 "detail": "method 'get' is not supported." (0) | 2024.07.01 |
---|---|
[졸프 백엔드] JWT로 로그아웃 구현하기 2 (0) | 2024.07.01 |
[졸프 딥러닝] smplx의 obj파일로 체형 분석을 해보자 (0) | 2024.04.08 |
[졸프 딥러닝] [버그 수집] smplfiy 코랩 오픈포즈 오류 (0) | 2024.04.04 |
[졸프 딥러닝] [버그 수집] 파이토치 버전 에러 (1) | 2024.04.02 |