본문 바로가기
서버 공부

Access Token & Refresh Token

by 모선효 2024. 5. 30.

 

안녕하세요! 저는 스프링 학습을 위해 커뮤니티 개인 프로젝트를 진행하고 있습니다.

오늘부터 프로젝트를 통해 배운 내용을 블로그에 정리하고자 합니다!

 

오늘은 Access Token과 Refresh Token에 대해 정리하겠습니다.

🌿Access Token & Refresh Token 정의

사용자의 정보와 권한 여부를 확인하기 위해 해당 정보를 Token에 담아 클라이언트와 서버가 주고 받습니다.

문제는 Token을 타인에게 탈취당하면 타인이 Token의 주인 행세를 할 수 있는데, 서버는 탈취한 사람인지, 진짜 주인인지 구분할 수 없습니다.

 

이를 해결하기 위해 Token에 유효 기간을 설정하고, 유효 기간이 만료되면 기존 Token은 파기한 뒤 사용자에게서 다시 인증을 받아내면서 새로운 Token을 생성합니다. 쉽게 말하면 Token이 만료되면 로그아웃되고, 다시 로그인하면 새로운 Token이 생성되는 것입니다. 여기서 말하는 Token이 바로 Access Token입니다.

 

Access Token은 유효 기간이 짧습니다. 유효 기간을 짧게 설정하면 탈취당해도 금방 만료되기 때문에 위험성이 줄어든다는 장점이 있지만, 사용자들이 자주 로그인을 해야 한다는 문제점이 있습니다.😥

 

이 문제의 해결 방안은 Refresh Token을 사용하는 것입니다. 이 토큰은 유효 기간이 길다는 특징이 있습니다.
처음에 로그인 할 때, Refresh Token과 Access Token을 동시에 발급 받습니다. 시간이 지나 Access Token이 만료되면 서버는 클라이언트로부터 Refresh Token을 받아, 클라이언트 인증을 진행합니다. 그리고 클라이언트가 맞다고 판단하면 새로운 Access Token을 발급해줍니다. 사용자가 굳이 로그아웃 & 로그인을 새로 하지 않아도 새로 토큰을 발급 받는 것입니다!

 

요약

  • Token을 통해 클라이언트 인증을 진행한다. 중요한 만큼 탈취 위험이 있다.
    ➡️ 유효기간을 설정하여 위험성을 줄인다.
  • Access Token은 유효 기간이 짧다.
    ➡️ 탈취에 대한 위험성은 줄어들지만, 자주 로그인 해야 한다.
    ➡️ Refresh Token 사용!
  • Refresh Token은 유효 기간이 길다.
    ➡️ 사용자는 자주 로그인을 하지 않아도 되고, 탈취 당할 위험도 적어진다.

🌿인증 과정

  1. 사용자 로그인 (ID/PW)
  2. 서버에서 회원 DB를 통해 ID와 PW 일치 여부 확인
  3. 서버에서 Access Token & Refresh Token 발급 (Refresh Token은 DB 혹은 cookie에 저장)
  4. 토큰을 client에 전달
  5. client는 Refresh Token을 안전한 저장소에 저장 후, Access Token을 header에 넣어 요청
  6. Access Token을 통해 사용자 인증 후
  7. 응답
  8. Access Token이 만료됐다면
  9. 5번처럼 서버에 요청을 보냈을 때
    10~11. 서버에서 Access Token 만료 여부를 확인하고, 만료됐음을 client 측에 전달
  10. Refresh Token과 Access Token을 모두 서버로 전달
  11. 서버에서 Access Token의 조작 여부를 확인한 후, DB 혹은 cookie에 저장해뒀던 Refresh Token 값과 동일한지 확인. Token이 동일하고, 유효기간이 지나지 않았다면 새로운 Access Token 발급

만약 Refresh Token이 만료된다면 새로 Access Token을 요청하는 과정에서 만료 됐음을 서버가 알아내면서 사용자를 로그아웃 시킵니다.

(+)

사실 Access Token만으로도 프로젝트를 구현할 수 있습니다. Refresh Token까지 넣으면 구현이 복잡해지며, Access Token을 새로 발급할 때 HTTP 요청 횟수가 많아진다는 단점이 있지만, 보안을 위해서라면 같이 구현하는 게 좋습니다.

 

다음 글에서는 제가 작성한 Token 발급 코드와 Access Token 재발급 코드에 대해 설명해보겠습니다!

  

💛 Reference

https://tansfil.tistory.com/59