본문 바로가기
Today I Learned 2024. 5. 29.

(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

출처 : https://medium.com/api-integration-essentials/jmeter-performance-testing-with-different-grant-types-offered-by-wso2-apim-part-5-refresh-token-1961f5506660

 

  1. Client → Server 로그인 요청
  2. Server DB에서 해당 사용자 확인후 Access Token & Refresh Token 발급해서 응답
    • 동시에 Server는 발급한 Refresh Token을 DB에 저장해서 보관해서
  3. Access Token 유효기간 동안 토큰과 함께 Client - Server 간 정보 교환
  4. 만료된 Access Token 요청 시, 관련 에러 응답
  5. Client 측에서 Access Token의 만료 사실을 인지하고, 가지고 있던 Refresh Token으로 Access Token 발급 요청
    • Client에서 수동으로 발급하기 보다는 토큰 만료 검사를 자동으로 시작을 하고, 발급요청하게끔 작동하는 것이 일반적
  6. Server는 DB에 저장되어있는 Refresh Token과 비교 후, 일치할 경우 Access Token 발급 후, 두 Token을 Client에 응답
    • DB에 저장되어 있는 Refresh Token을 Access Token을 재발급할 때 다시 재발급 하는 방법으로 Refresh Token의 탈취 위험을 감소시킬 수 있음
  7. 발급된 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)


과제를 시작했는데, 너무 깔끔하게 진행할 수 없기 때문에, 스스로 너무 만족스럽지 못한 결과물이 나오는 것 같아서 자존감이 많이 떨어지지만, 실수를 하면서 똑같은 코드를 두세번 할수없이 반복해서 쓰는 것도 학습하는 면에서는 많이 도움이 되었던 것 같다.