Today I Learned
(24.05.29)[7주차] JWT Access Token과 Refresh Token 정리
개인 과제에 필요한 토큰의 종류와 이를 다루는 방식, 그리고 과제에 적용하기 위해 JWT Access Token 과 Refresh Token을 정리 했다.
JWT Access Token과 Refresh Token
- 토큰을 2개를 만들어서 활용하라는 과제로이에 대해서 고민하고 찾아보면서 공부를 한 것을 정리했다.
- 가급적이면 참고자료의 문헌을 보지 않고, 이해하고 나만의 언어로 외워서 정리하려고 노력했다.
기존 JWT, JSON Web Token
- 인증 인가의 방식으로 Client-Server간 주고 받을 수 있는 방법
외부의 탈취가 쉬운 환경
- Client-Server간 어떤 Key값을 토대로 정보=Payload 를 토큰화 시키고 주고 받기 때문에, 중간에 Key값을 알고 중간에 Token을 갈취만 할 수 있다면, 어떤 정보가 포함되어있는지 알 수 있음
- 알고리즘를 통한 쉬운 정보 탈취
- 따라서 비밀번호 등의 민감한 정보는 토큰화 시키면 안되는 한계점
- 개발자가 정해놓은 토큰의 유효기간이 만료가되기 전까지 무제한으로 외부에서 토큰을 만들어서 Server에 요청을 보낼 수 있음
Refresh Token
- 해결방법으로 기존의 JWT를 Access Token, 그리고 더 긴 유효기간을 가진 JWT를 Refresh Token으로 동시에 생성해서 활용
- Refresh Token는 Access Token을 생성하는 토큰
- Access Token의 Payload에 정보를 담은 토큰
- Access Token의 유효기간이 만료가 될 경우 Server에 Refresh 토큰으로 Request 해서 다시 Access Token을 받아와야
Flow
- Client → Server 로그인 요청
- Server DB에서 해당 사용자 확인후 Access Token & Refresh Token 발급해서 응답
- 동시에 Server는 발급한 Refresh Token을 DB에 저장해서 보관해서
- Access Token 유효기간 동안 토큰과 함께 Client - Server 간 정보 교환
- 만료된 Access Token 요청 시, 관련 에러 응답
- Client 측에서 Access Token의 만료 사실을 인지하고, 가지고 있던 Refresh Token으로 Access Token 발급 요청
- Client에서 수동으로 발급하기 보다는 토큰 만료 검사를 자동으로 시작을 하고, 발급요청하게끔 작동하는 것이 일반적
- Server는 DB에 저장되어있는 Refresh Token과 비교 후, 일치할 경우 Access Token 발급 후, 두 Token을 Client에 응답
- DB에 저장되어 있는 Refresh Token을 Access Token을 재발급할 때 다시 재발급 하는 방법으로 Refresh Token의 탈취 위험을 감소시킬 수 있음
- 발급된 Refresh Token을 Client는 저장을하고 다시 Access Token을 통해 Client ↔ Server 통신
→ 따라서, Refresh Token이 다 만료가 될 때까지, Client의 로그인 상태가 상대가 로그아웃 요청이 있기 전까지 계속 유지하는 상황이 이어지게 됨
Refresh Token의 수
- 무조건 User 한 명당 1개일 경우
- User가 새로운 환경에서 로그인 시도를 할 경우, 다른 로그인 상태 = Refresh Token이 존재한 상태에서 모든 Refresh Token삭제 → 최근 로그인 시, 발급한 Refresh Token으로 대체
- User 한 명당 여러개일 경우
- User가 새로운 환경들 = 다른 기기, 다른 브라우저 등 에서 로그인 상태일 때, 각각 마다 Refresh Token을 부여할 경우 한명당 여러개의 Refresh Token을 가질 수 있음
(참고자료 : Jmeter performance testing with different grant types offered by WSO2 APIM - (Refresh_token grant Type), https://medium.com/api-integration-essentials/jmeter-performance-testing-with-different-grant-types-offered-by-wso2-apim-part-5-refresh-token-1961f5506660)
과제를 시작했는데, 너무 깔끔하게 진행할 수 없기 때문에, 스스로 너무 만족스럽지 못한 결과물이 나오는 것 같아서 자존감이 많이 떨어지지만, 실수를 하면서 똑같은 코드를 두세번 할수없이 반복해서 쓰는 것도 학습하는 면에서는 많이 도움이 되었던 것 같다.
'Today I Learned' 카테고리의 다른 글
(24.05.31)[7주차] Spring Security Filter에서의 Password Encoder (1) | 2024.05.31 |
---|---|
(24.05.30)[7주차] Access Token과 Refresh Token 구현 (0) | 2024.05.30 |
(24.05.28)[7주차] void 반환 타입일 때의 response 사용 (0) | 2024.05.28 |
(24.05.27)[7주차] Validation 의 @Pattern (0) | 2024.05.27 |
(24.05.25)[6주차] WIL (0) | 2024.05.25 |