개발 공부 일지/ETC

[JWT] Refresh Token이란?

dev-hpk 2024. 12. 7. 14:33

JWT 토큰을 사용할 때 Access Token만 사용하는 경우 많은 문제가 발생합니다. 이를 해결하기 위해 Refresh Token을 사용하는데요, Refresh Token은 보안과 관련된 핵심 개념 중 하나로, 특히 인증이 필요한 웹 애플리케이션에서 자주 사용됩니다.

 

목차

1. JWT 토큰이란?

2. Access 토큰만 사용하는 경우 문제점

3. Refresh Token이란?

4. Refresh Token 탈취 위험

추천글

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

1. JWT 토큰이란?

JWT(JSON Web Token)는 클라이언트와 서버 간 인증 및 정보 교환을 위한 토큰 기반 인증 방식입니다. JWT는 간단하고 효율적이며, 다양한 애플리케이션에서 널리 사용됩니다.  

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

동작 방식

서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의합니다.
Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급합니다.

 

2. Access Token만 사용하는 경우 문제점

Access Token은 일반적으로 짧은 수명을 가집니다 (예: 15분 ~ 1시간). 이는 보안을 강화하기 위해 설정됩니다.

 

짧은 수명으로 인한 빈번한 인증

  • Access Token만 사용하는 경우, 토큰이 만료되면 클라이언트는 다시 인증을 받아야 합니다.
  • 결과적으로 사용자가 자주 로그인을 해야 하며, 이는 사용자 경험(UX)에 부정적인 영향을 미칩니다.

토큰 탈취 시 보안 위험

  • Access Token만 사용하는 경우, 빈번한 인증을 줄이기 위해 만료 기간을 길게 설정할 것입니다. Access Token은 서버 리소스에 바로 접근할 수 있는 권한을 부여하기 때문에 탈취될 경우 공격자는 해당 토큰을 사용해 오랜 기간 리소스에 접근할 수 있습니다.
  • Access Token만 사용하는 경우 탈취된 토큰이 만료되기 전까지 막을 수 있는 방법이 없습니다.

로그아웃 처리의 어려움 

  • Access Token만 사용할 경우 서버에서 로그아웃 처리가 어렵습니다.
  • JWT는 기본적으로 상태를 저장하지 않는 "Stateless" 구조를 따릅니다. 즉, 서버는 클라이언트가 보낸 Access Token만 검증할 수 있으며, 특정 사용자의 세션을 무효화하려면 다음과 같은 추가 작업이 필요합니다:
    • Blacklist: 서버에 만료된 또는 취소된 토큰을 추적하는 메커니즘을 추가.
    • Whitelist: 활성화된 토큰만 추적 및 허용.
  • 둘 다 서버 자원을 소모하며 JWT의 Stateless 장점을 무너뜨릴 수 있습니다.

인증 서버 부하 증가

 

  • Access Token의 짧은 수명으로 인해 사용자는 더 자주 로그인을 요청하게 됩니다.
  • 이는 인증 서버에 부하를 줄 수 있으며, 특히 사용자가 많을수록 서버 리소스를 효율적으로 사용하지 못하게 됩니다.

 

3. Refresh Token이란?

Refresh Token은 Access Token의 만료 시 새로운 Access Token의 발급을 요청하기 위해 사용되는 토큰입니다. 일반적으로 Access Token은 짧은 유효기간을 가지며, 만료되었을 때 사용자는 다시 로그인해야 합니다. Refresh Token은 사용자가 다시 로그인하지 않더라도 새로운 액세스 토큰을 발급받을 수 있도록 돕는 역할을 합니다.

 

Access Token vs Refresh Token

항목 Access Token Refresh Token
유효기간 짧음 (예: 15분 ~ 1시간) 비교적 김 (예: 며칠 ~ 몇 주)
역할 API 인증 요청 새로운 Access Token 발급

 

Refresh Token이 필요한 이유

짧은 수명으로 인한 빈번한 인증 해소

 

  • Refresh Token은 비교적 긴 유효 기간(예: 며칠 ~ 몇 주)을 가지며, 사용자가 다시 로그인하지 않고 새로운 Access Token을 발급받을 수 있도록 합니다.
  • 이렇게 하면 짧은 Access Token 유효 기간을 유지하면서도 사용자 경험을 해치지 않을 수 있습니다.

보안 강화

  • 토큰이 네트워크를 통해 전송되는 과정에서 탈취되면 공격자가 해당 토큰을 악용할 수 있습니다. 하지만 Refresh Token은 일반적으로 클라이언트가 API 요청 시마다 전송하지 않아 탈취 가능성이 적습니다.
  • Access Token이 탈취되더라도, 짧은 유효 기간으로 인해 공격자는 제한된 시간 동안만 이를 악용할 수 있습니다.
  • 탈취된 Access Token으로 API 요청을 할 때, 서버는 Refresh Token이 없으므로 장기적으로는 더 이상 토큰 갱신이 불가능해 보안적으로 유리합니다.

서버 부하 감소

 

  • JWT는 Stateless 방식으로 설계되어 서버가 토큰 상태를 저장하지 않습니다. 따라서 토큰이 만료된 경우, 서버는 클라이언트에게 새로운 인증을 요구해야 합니다.
  • Refresh Token을 사용하면 서버는 토큰을 상태로 저장하지 않으면서도 필요한 경우 새로운 Access Token을 발급할 수 있습니다.

강제 로그아웃 및 토큰 관리

  • Refresh Token이 있으면, 서버에서 관리하고 Refresh Token을 폐기함으로써 Access Token 재발급을 방지할 수 있습니다. 이를 통해 토큰 관리와 보안을 보다 세밀하게 조정할 수 있습니다.

 

 

4. Refresh Token 탈취 위험

Refresh Token의 통신 빈도가 적기는 하지만 탈취 위험에서 완전히 벗어난 것은 아닙니다.

 

탈취 경로

 

  • 네트워크 공격: 토큰이 HTTPS가 아닌 연결에서 전송될 때 도청 가능.
  • 클라이언트 측 취약점: 로컬 스토리지, 세션 스토리지, 또는 쿠키에서 탈취.
  • 서버 측 데이터 유출: 서버의 Refresh Token 저장소가 공격받을 경우 유출.
  • 악성 스크립트: XSS(Cross Site Scripting) 공격을 통해 클라이언트의 토큰을 탈취.

 

탈취 시 발생하는 문제점

 

  • 무단 Access Token 생성: 공격자는 탈취한 Refresh Token을 사용해 무제한으로 새로운 Access Token을 생성할 수 있습니다. Access Token을 이용해 사용자의 데이터에 접근하거나 보호된 API를 호출할 수 있습니다.
  • 세션 하이재킹: 공격자가 Refresh Token으로 Access Token을 지속적으로 갱신하면서 사용자 세션을 장악할 수 있습니다.
  • 서버 리소스 남용: 공격자가 Refresh Token을 대량으로 악용해 Access Token 발급 요청을 남발할 경우, 서버 리소스가 불필요하게 소모됩니다. 이는 서비스 거부(DoS) 공격으로 이어질 수 있습니다.

탈취 방지 대책

  • HttpOnly 쿠키 사용: 토큰을 클라이언트 측에서 접근할 수 없도록 HttpOnly 쿠키에 저장하면, XSS 공격으로부터 토큰을 보호하는 데 효과적입니다.
  • 1회성 토큰(One-Time Token) 방식: Refresh Token이 사용되면 즉시 폐기하고 새로 발급합니다.
  • TLS(HTTPS) 강제화: Refresh Token을 안전하게 전송하기 위해 HTTPS를 사용하도록 강제합니다.
  • 토큰 스코프 제한: Refresh Token으로 할 수 있는 작업을 최소화하여, 탈취 시 피해를 줄입니다.
  • 적절한 유효기간 설정: Refresh Token에도 적절한 만료 기간을 설정해 탈취 후 악용 시간을 줄입니다.

 

아래 링크는 OAuth에서 제시한 Refresh Token Rotation 방식입니다. 클라이언트가 Access Token를 재요청할 때마다 Refresh Token도 새로 발급받습니다. 궁금하시면 참고해보세요!

 

Auth0

Get started using Auth0. Implement authentication for any kind of application in minutes.

auth0.com

 

 

 

Refresh Token은 강력한 인증 체계를 지원하지만, 탈취되면 큰 위협이 될 수 있습니다. 이를 방지하기 위해 안전한 저장 방식과 네트워크 보안을 적용하고, 탈취 가능성을 최소화하는 설계가 필요합니다.

 

 

추천글

 

[Next] ISR (+ On-Demand ISR)

ISR(Incremental Static Regeneration)은 정적 생성(SSG)의 장점과 실시간 업데이트를 결합한 강력한 기능이며, 이와 관련된 On-Demand ISR은 ISR을 더욱 효과적으로 사용할 수 있도록 돕습니다. 목차 1. ISR(Incream

dev-hpk.tistory.com

 

 

프레임워크(Framework)와 라이브러리(Library)의 차이

개발에서는 프레임워크와 라이브러리라는 용어가 자주 등장합니다. 이 둘은 개발 효율성을 높이고 코드 품질을 향상시키기 위해 사용되지만, 그 개념과 활용 방식에서 명확한 차이가 있습니다

dev-hpk.tistory.com