JWT와 AccessToken, RefreshToken

JWT

 

Access Token과 Refresh Token의 필요성

 

JWT(JSON Web Token)는 사용자의 신원이나 권한 정보를 담고 있는 데이터 조각이다. JWT 인증 방식에서는 비밀키(개인키 또는 대칭키)를 사용해 토큰을 암호화하여 보안을 유지한다.

 

하지만 JWT 토큰이 탈취당하면 문제가 발생할 수 있다. 탈취한 공격자는 마치 정상 사용자처럼 인증을 통과할 수 있으며, 서버는 원래 사용자와 공격자를 구분할 방법이 없다.

 

따라서 JWT에는 유효 기간(expiration time)을 설정하는 것이 필수적이다.

 

💡 그러나 유효 기간을 짧게 설정하면 사용자가 자주 로그인을 해야 하고, 너무 길게 설정하면 보안상 위험이 커진다.

 

이를 해결하기 위해 Access Token과 Refresh Token이라는 두 개의 JWT를 사용한다.

 

  • Access Token: 짧은 유효 기간을 가지며, API 요청 시 사용
  • Refresh Token: 상대적으로 긴 유효 기간을 가지며, Access Token이 만료되었을 때 새로운 Access Token을 발급받는 데 사용

 

💡 통신과정에서 탈취당할 위험이 큰 Access Token의 만료 기간을 짧게 두고 Refresh Token으로 주기적으로 재발급함으로써 피해를 최소화할 수 있다.

 

서버 클라이언트 통신

 

서버-클라이언트 통신에서 Access Token과 Refresh Token을 어떻게 활용할 수 있는지 알아보자.

 

1. 토큰 발급

 

  • 클라이언트가 로그인 인증에 성공하면 Access Token과 Refresh Token을 서버로부터 받는다.
  • 클라이언트는 두 개의 토큰을 로컬에 안전하게 저장한다.

 

2. API 요청 시 토큰 사용

 

  • 클라이언트는 요청을 보낼 때 Authorization 헤더에 Access Token을 포함하여 서버와 통신한다.
  • 일부 구현에서는 요청마다 Access Token과 Refresh Token을 함께 보내고, Access Token이 만료된 경우 Refresh Token을 이용해 새 Access Token을 발급받을 수도 있다.

 

3. Access Token 만료 처리

 

  • 일정 시간이 지나면 Access Token이 만료된다.
  • 클라이언트가 만료된 Access Token을 포함하여 요청하면, 서버는 401 (Unauthorized) 에러 코드로 응답한다.
  • 이 응답을 통해 클라이언트는 invalid_token 상태를 감지하고 적절한 조치를 취할 수 있다.

 

4. Refresh Token을 이용한 재발급

 

  • Access Token이 만료된 경우, 클라이언트는 요청의 헤더에 Refresh Token을 포함하여 새 Access Token 발급을 요청할 수 있다.
  • 서버는 Refresh Token을 검증한 후, 새 Access Token을 응답 헤더에 포함하여 반환한다.
  • 만약 Refresh Token도 만료되었다면, 서버는 다시 401 에러 코드를 반환하며, 클라이언트는 재로그인이 필요하다.

 

5. 보안 고려 사항

 

  • Access Token은 통신이 빈번하여 탈취될 가능성이 있지만, 유효 기간이 짧아 공격자는 지속적으로 새로운 토큰을 탈취해야 한다.
  • JWT (JSON Web Token)의 만료 시간은 클라이언트가 임의로 변경할 수 없으므로, 짧은 유효 기간을 설정하고 Refresh Token을 활용하는 방식이 보안성을 높이는 데 효과적이다.

 

Refresh 토큰 탈취 위험

 

Refresh Token의 통신 빈도는 Access Token보다 적지만, 탈취 위험에서 완전히 자유롭지는 않다.

 

이를 방지하기 위해 OAuth에서는 Refresh Token Rotation 기법을 제안한다.

 

Refresh Token Rotation이란, 클라이언트가 새로운 Access Token을 요청할 때마다 기존 Refresh Token을 폐기하고 새로운 Refresh Token을 발급받는 방식이다.

 

이렇게 하면, 탈취자가 보유한 Refresh Token은 더 이상 장기간 유효한 토큰이 아니게 되므로, 불법적인 사용 가능성이 줄어든다. 결과적으로 보안성을 더욱 강화할 수 있다.

 

마치며

 

JWT의 Access Token과 Refresh Token이 존재하는 이유를 명확히 알지 못했었는데, 이번에 공부하면서 두 토큰의 필요성과 역할을 더욱 깊이 이해할 수 있었다. 이를 통해 JWT를 활용한 인증 메커니즘 전반을 보다 명확하게 파악할 수 있게 되었다.

 

참고

🧐 Access Token과 Refresh Token이란 무엇이고 왜 필요할까?

'Dev > Spring Security' 카테고리의 다른 글

CORS  (0) 2025.02.11
CSRF  (0) 2025.02.11