Access Token과 Refresh Token

유정원·2024년 8월 30일

python

목록 보기
12/21

Access TokenRefresh Token은 토큰 기반 인증 시스템에서 자주 사용되는 두 가지 유형의 토큰입니다. 이 두 토큰은 서로 다른 목적을 가지고 있으며, 보안성과 사용자 경험을 향상시키기 위해 함께 사용됩니다.

Access Token

  • 역할: Access Token은 사용자나 클라이언트 애플리케이션이 인증된 상태임을 증명하는 토큰입니다. 서버는 이 토큰을 통해 클라이언트가 요청하는 리소스에 대한 권한이 있는지 확인합니다.

  • 수명: Access Token은 비교적 짧은 수명을 가지고 있습니다. 일반적으로 몇 분에서 몇 시간 정도의 유효 기간을 가지며, 이 기간이 지나면 만료되어 더 이상 사용할 수 없습니다. 짧은 수명을 가짐으로써, 토큰이 유출되었을 때의 위험을 줄일 수 있습니다.

  • 사용: 클라이언트는 Access Token을 HTTP 요청의 헤더에 포함시켜 서버에 전송합니다. 서버는 이 토큰을 검증하고, 유효하다면 요청된 리소스를 제공하거나 작업을 수행합니다.

    예시:

    Authorization: Bearer <access_token>

Refresh Token

  • 역할: Refresh Token은 만료된 Access Token을 갱신하기 위해 사용됩니다. Refresh Token을 사용하면 사용자가 다시 로그인하지 않고도 새로운 Access Token을 발급받을 수 있습니다.

  • 수명: Refresh Token은 Access Token보다 훨씬 긴 수명을 가집니다. 일반적으로 몇 주에서 몇 달까지 유효할 수 있습니다. 이 토큰은 민감한 정보로 간주되므로, 잘 보호되어야 합니다.

  • 사용: 클라이언트가 Access Token이 만료되었을 때, Refresh Token을 서버에 전송하여 새로운 Access Token을 요청합니다. 서버는 Refresh Token의 유효성을 확인한 후, 새로운 Access Token을 발급합니다.

    예시:

    {
      "refresh": "<refresh_token>"
    }

Access Token과 Refresh Token의 관계

  • 수명 관리: Access Token의 짧은 수명은 보안 강화를 위해 설정된 것이며, Refresh Token은 사용자 경험을 개선하기 위해 설정된 것입니다. Refresh Token을 사용하면 사용자가 매번 로그인할 필요 없이 Access Token을 자동으로 갱신할 수 있습니다.
  • 보안: Refresh Token은 매우 민감한 정보이므로, 일반적으로 클라이언트 측에 안전하게 저장되어야 하며, 가능한 한 서버 측에서만 사용되도록 제한해야 합니다. 만약 Refresh Token이 유출되면, 공격자는 새로운 Access Token을 계속해서 발급받을 수 있기 때문에 큰 보안 위험을 초래할 수 있습니다.

Django에서 Access Token과 Refresh Token 사용 예시

Django REST Framework와 djangorestframework-simplejwt 라이브러리를 사용하여 JWT 기반 인증을 설정하면, Access Token과 Refresh Token을 사용할 수 있습니다.

Access Token 발급

클라이언트가 /api/token/ 엔드포인트에 사용자 자격 증명(예: 이메일, 비밀번호)을 POST 요청으로 보내면, 서버는 Access Token과 Refresh Token을 발급합니다.

Refresh Token을 사용한 Access Token 갱신

Access Token이 만료되었을 때, 클라이언트는 /api/token/refresh/ 엔드포인트에 Refresh Token을 보내어 새로운 Access Token을 발급받습니다.

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

요청 예시

  1. Access Token과 Refresh Token 발급:

    • 클라이언트가 /api/token/에 로그인 자격 증명을 보냅니다.
    • 서버는 유효한 자격 증명에 대해 Access Token과 Refresh Token을 응답으로 반환합니다.

    요청:

    {
      "username": "user",
      "password": "password"
    }

    응답:

    {
      "access": "<access_token>",
      "refresh": "<refresh_token>"
    }
  2. Access Token 갱신:

    • 클라이언트가 /api/token/refresh/에 Refresh Token을 보냅니다.
    • 서버는 새로운 Access Token을 응답으로 반환합니다.

    요청:

    {
      "refresh": "<refresh_token>"
    }

    응답:

    {
      "access": "<new_access_token>"
    }

요약

  • Access Token은 클라이언트가 리소스에 접근할 때 사용하며, 수명이 짧습니다.
  • Refresh Token은 Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용되며, 수명이 길고 민감한 정보로 취급됩니다.
  • Django에서 djangorestframework-simplejwt와 같은 라이브러리를 사용해 Access Token과 Refresh Token을 쉽게 관리할 수 있습니다.

0개의 댓글