Spring/Spring Security

[JWT] 2. AccessToken과 RefreshToken

noahkim_ 2023. 10. 3. 02:22

1. AccessToken

권한 토큰
  • 보안 리소스를 접근하고자 하는 유저에게 부여
  • 사용자 정의 클레임을 두어 사용할 수 있습니다. (IP 등)

 

유효기간
  • 보안상 을 짧은 시간으로 설정 (1시간)
    • 공격자에 의해 노출되더라도 오랜시간 사용하지 못하게 하기 위함입니다.
  • 만료 시, 재요청이 필요합니다 (만료되면 효과가 없습니다.)

 

2. RefreshToken

권한 토큰 갱신
  • AccessToken이 만료될 때, 새로운 AccessToken을 요청하기 위한 토큰입니다.

 

유효기간
  • AccessToken과 다르게 긴 유효시간을 가집니다.

 

사용자 경험 향상
  • 주기적인 AccessToken 발급에 대한 사용자 인증 요청을 줄일 수 있음
  • AccessToken이 만료되면, 클라이언트는 새로운 AccessToken을 받기위해 인증서버에 새로운 요청을 해야 합니다.
  • 계속해서 요청할 경우 사용자 경험이 나빠집니다.
  • RefreshToken을 사용하여 자동으로 AccessToken을 발급받을 수 있어 사용자는 자주 인증과정을 거치지 않아도 됩니다.

 

보관 (서버)
  • 클라이언트 접속을 더 효과적으로 관리할 수 있도록 돕습니다.
  • 공격자에게 노출되었을 경우 무효화할 수 있습니다.
  • RefreshToken을 통해 발급된 AccessToken의 속성을 변경할 수 있습니다.

 

위험성 (보안 매우 중요)
  • 노출될 경우, 긴 유효기간을 가지므로 그 기간동안 시스템을 무제한으로 액세스할 수 있습니다.

 

3. 사용 과정

인증 요청

  • 클라이언트: 로그인 정보를 서버에 전송합니다.
  • 서버: 제공된 로그인 정보를 검증합니다.

 

JWT 생성 (서버)

  • payload 생성 (사용자 정보 + 메타데이터)
  • JWT 생성 (비밀키로 JWT 서명)

 

응답

  • 서버: AccessToken와 RefreshToken 생성 및 응답 (Cookie: httpOnly)
  • 클라이언트: AccessToken와 RefreshToken을 보관 (Session Storage)

 

인증된 요청

  • 클라이언트
    • 서버에 요청을 보낼때마다 AccessToken을 보냄
    • Authorization 헤더를 사용하여 Bearer 형태로 전송합니다.
  • 서버
    • 요청에 포함된 JWT를 검증합니다. (서명 유효성, 토큰의 만료 여부 등)
  • 검증에 성공하면 요청된 작업을 수행합니다.

 

RefreshToken 사용

  • AccessToken가 만료될 경우, 클라이언트는 새로운 AccessToken를 요청합니다. (저장된 RefreshToken 사용)
  • 서버
    • RefreshToken 유효성 검사 (서명 유효성, 만료 여부 등)
    • 새로운 AccessToken를 생성하여 클라이언트에게 응답

 

 

참고