목차
[문제 정의]
" 보안에서는 왜 Refresh를 안쓰고 Access만 쓰는가? "
[정의]
- Access 토큰:
- Access 토큰은 클라이언트(예: 웹 애플리케이션, 모바일 앱)가 서버에 리소스에 접근하는 데 사용되는 인증 토큰
- 주로 OAuth 2.0 및 OpenID Connect와 같은 프로토콜에서 발급되며, 사용자가 리소스에 대한 권한을 나타낸다.
- 일반적으로 짧은 유효 기간(예: 몇 분 또는 몇 시간) 동안 유효하며, 유효 기간이 지나면 재발급이 필요하다.
- Access 토큰은 보통 HTTP 요청의 헤더에 포함되어 서버에 전송된다.
- Refresh 토큰:
- Refresh 토큰은 Access 토큰의 갱신을 위한 특별한 토큰입니다.
- 주로 OAuth 2.0의 인증 코드 그랜트 방식에서 사용됩니다.
- Refresh 토큰은 일반적으로 Access 토큰보다 더 긴 유효 기간을 갖습니다(예: 몇 일 또는 몇 주).
- Access 토큰이 만료되면, 클라이언트는 Refresh 토큰을 사용하여 새로운 Access 토큰을 요청합니다.
- Refresh 토큰은 Access 토큰과는 달리 사용자의 인증 정보가 포함되어 있어, 보다 안전한 저장소에 보관되어야 합니다.
[차이점 POINT!]
Access 토큰은 실제 리소스에 접근하는 데 사용되고, 짧은 유효 기간을 갖는다.
Refresh 토큰은 새로운 Access 토큰을 발급하는 데 사용되며, 보다 긴 유효 기간을 갖는다.
[Refresh 토큰 대신에 선택되는 이유]
1. 간편성
- Access 토큰은 유효 기간이 짧고 갱신할 필요가 없기 때문에 구현이 더 간편하다.
- Refresh 토큰을 사용하는 경우에는 Access 토큰과 함께 Refresh 토큰을 관리해야 하며, 토큰을 저장하고 갱신하는 별도의 로직이 필요하다.
2. 보안
- Refresh 토큰은 Access 토큰보다 더 긴 유효 기간을 갖기 때문에 보안 상의 위험이 높을 수 있다.
- Access 토큰을 주기적으로 갱신하면서 사용하면, 만약 Access 토큰이 탈취되더라도 유효 기간이 짧아서 피해를 최소화할 수 있다.
3. 서버 부담 감소
- Refresh 토큰을 사용하는 경우에는 토큰을 관리하기 위해 서버 측에서 추가적인 저장 공간과 로직이 필요하다.
- 하지만 Access 토큰만 사용하는 경우에는 각 요청마다 서버에서 토큰을 확인하고 새로 발급하는 데 필요한 작업이 줄어든다.
4. 특별한 요구 사항
- 어떤 상황에서는 Refresh 토큰 대신에 Access 토큰만으로도 충분한 경우가 있다.
- 예를 들어, 일회성 액세스가 필요한 서비스나 보안 요구 사항이 덜한 상황 등에서는 Access 토큰만으로도 충분할 수 있다.

https://apim.docs.wso2.com/en/3.2.0/learn/api-security/oauth2/grant-types/refresh-token-grant/
그러나 이러한 이유들은 상황에 따라 다를 수 있으며,
보안 요구 사항이나 서비스의 특성에 따라 Refresh 토큰을 사용하는 것이 더 적절한 경우도 있다.
[Django에서 Access 토큰과 Refresh 토큰을 활용하는 방법]
- 주로 Django REST Framework (DRF)를 사용하여 API 인증 및 권한 관리에 관련된다.
- 일반적으로 DRF에서는 Django의 기본 인증 시스템과 함께 JWT(JSON Web Tokens)나 OAuth 2.0과 같은 인증 프로토콜을 사용하여 Access 토큰과 Refresh 토큰을 구현한다.
- 여기에는 Django에서의 일반적인 사용법이 포함된다:
1. Django REST Framework 설치
- 먼저 Django 프로젝트에 Django REST Framework를 설치(API 뷰 및 인증을 구현)
pip install djangorestframework
2. JWT 인증 구현
- Django에서 JWT(JSON Web Tokens)를 사용하여 인증을 구현할 수 있다.
- djangorestframework-jwt 또는 simplejwt와 같은 라이브러리를 설치한다.
pip install djangorestframework-simplejwt
pip install djangorestframework-jwt
3. Access 토큰과 Refresh 토큰 설정
- JWT 또는 simplejwt와 같은 라이브러리를 사용하여 Access 토큰과 Refresh 토큰을 설정한다.
- 일반적으로 사용자의 로그인 시 생성되고, 필요할 때마다 갱신된다.
4. API 뷰 보호
- 인증이 필요한 API 뷰에는 @api_view 데코레이터나 APIView 클래스를 사용하여 접근 제어를 추가한다.
- 이를 통해 유효한 Access 토큰이나 Refresh 토큰을 요구할 수 있다.
5. Refresh 토큰 사용
- Access 토큰의 유효 기간이 만료되면, 클라이언트는 Refresh 토큰을 사용하여 새로운 Access 토큰을 요청한다.
- 엔드포인트 필요
간단 축약 구현 방법
1. settings.py 설정
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt.token_blacklist',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
2. urls.py 설정
# urls.py
from django.urls import path
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'),
]
3. API 뷰 보호
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
class ProtectedView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
content = {'message': 'This is a protected API view!'}
return Response(content)
4. Refresh 토큰 사용
# urls.py
from django.urls import path
from rest_framework_simplejwt.views import TokenRefreshView
urlpatterns = [
...
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
'Django' 카테고리의 다른 글
Django : backend framework(6) (0) | 2024.03.19 |
---|---|
마이그레이션 : 관련 모델이나 필드가 해석되지 못할 때 (0) | 2024.03.19 |
Django : backend framework(5) (0) | 2024.03.19 |
Django : backend framework(4) (0) | 2024.03.18 |
Django : backend framework(3) (0) | 2024.03.15 |
[문제 정의]
" 보안에서는 왜 Refresh를 안쓰고 Access만 쓰는가? "
[정의]
- Access 토큰:
- Access 토큰은 클라이언트(예: 웹 애플리케이션, 모바일 앱)가 서버에 리소스에 접근하는 데 사용되는 인증 토큰
- 주로 OAuth 2.0 및 OpenID Connect와 같은 프로토콜에서 발급되며, 사용자가 리소스에 대한 권한을 나타낸다.
- 일반적으로 짧은 유효 기간(예: 몇 분 또는 몇 시간) 동안 유효하며, 유효 기간이 지나면 재발급이 필요하다.
- Access 토큰은 보통 HTTP 요청의 헤더에 포함되어 서버에 전송된다.
- Refresh 토큰:
- Refresh 토큰은 Access 토큰의 갱신을 위한 특별한 토큰입니다.
- 주로 OAuth 2.0의 인증 코드 그랜트 방식에서 사용됩니다.
- Refresh 토큰은 일반적으로 Access 토큰보다 더 긴 유효 기간을 갖습니다(예: 몇 일 또는 몇 주).
- Access 토큰이 만료되면, 클라이언트는 Refresh 토큰을 사용하여 새로운 Access 토큰을 요청합니다.
- Refresh 토큰은 Access 토큰과는 달리 사용자의 인증 정보가 포함되어 있어, 보다 안전한 저장소에 보관되어야 합니다.
[차이점 POINT!]
Access 토큰은 실제 리소스에 접근하는 데 사용되고, 짧은 유효 기간을 갖는다.
Refresh 토큰은 새로운 Access 토큰을 발급하는 데 사용되며, 보다 긴 유효 기간을 갖는다.
[Refresh 토큰 대신에 선택되는 이유]
1. 간편성
- Access 토큰은 유효 기간이 짧고 갱신할 필요가 없기 때문에 구현이 더 간편하다.
- Refresh 토큰을 사용하는 경우에는 Access 토큰과 함께 Refresh 토큰을 관리해야 하며, 토큰을 저장하고 갱신하는 별도의 로직이 필요하다.
2. 보안
- Refresh 토큰은 Access 토큰보다 더 긴 유효 기간을 갖기 때문에 보안 상의 위험이 높을 수 있다.
- Access 토큰을 주기적으로 갱신하면서 사용하면, 만약 Access 토큰이 탈취되더라도 유효 기간이 짧아서 피해를 최소화할 수 있다.
3. 서버 부담 감소
- Refresh 토큰을 사용하는 경우에는 토큰을 관리하기 위해 서버 측에서 추가적인 저장 공간과 로직이 필요하다.
- 하지만 Access 토큰만 사용하는 경우에는 각 요청마다 서버에서 토큰을 확인하고 새로 발급하는 데 필요한 작업이 줄어든다.
4. 특별한 요구 사항
- 어떤 상황에서는 Refresh 토큰 대신에 Access 토큰만으로도 충분한 경우가 있다.
- 예를 들어, 일회성 액세스가 필요한 서비스나 보안 요구 사항이 덜한 상황 등에서는 Access 토큰만으로도 충분할 수 있다.

https://apim.docs.wso2.com/en/3.2.0/learn/api-security/oauth2/grant-types/refresh-token-grant/
그러나 이러한 이유들은 상황에 따라 다를 수 있으며,
보안 요구 사항이나 서비스의 특성에 따라 Refresh 토큰을 사용하는 것이 더 적절한 경우도 있다.
[Django에서 Access 토큰과 Refresh 토큰을 활용하는 방법]
- 주로 Django REST Framework (DRF)를 사용하여 API 인증 및 권한 관리에 관련된다.
- 일반적으로 DRF에서는 Django의 기본 인증 시스템과 함께 JWT(JSON Web Tokens)나 OAuth 2.0과 같은 인증 프로토콜을 사용하여 Access 토큰과 Refresh 토큰을 구현한다.
- 여기에는 Django에서의 일반적인 사용법이 포함된다:
1. Django REST Framework 설치
- 먼저 Django 프로젝트에 Django REST Framework를 설치(API 뷰 및 인증을 구현)
pip install djangorestframework
2. JWT 인증 구현
- Django에서 JWT(JSON Web Tokens)를 사용하여 인증을 구현할 수 있다.
- djangorestframework-jwt 또는 simplejwt와 같은 라이브러리를 설치한다.
pip install djangorestframework-simplejwt
pip install djangorestframework-jwt
3. Access 토큰과 Refresh 토큰 설정
- JWT 또는 simplejwt와 같은 라이브러리를 사용하여 Access 토큰과 Refresh 토큰을 설정한다.
- 일반적으로 사용자의 로그인 시 생성되고, 필요할 때마다 갱신된다.
4. API 뷰 보호
- 인증이 필요한 API 뷰에는 @api_view 데코레이터나 APIView 클래스를 사용하여 접근 제어를 추가한다.
- 이를 통해 유효한 Access 토큰이나 Refresh 토큰을 요구할 수 있다.
5. Refresh 토큰 사용
- Access 토큰의 유효 기간이 만료되면, 클라이언트는 Refresh 토큰을 사용하여 새로운 Access 토큰을 요청한다.
- 엔드포인트 필요
간단 축약 구현 방법
1. settings.py 설정
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt.token_blacklist',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
2. urls.py 설정
# urls.py
from django.urls import path
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'),
]
3. API 뷰 보호
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
class ProtectedView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
content = {'message': 'This is a protected API view!'}
return Response(content)
4. Refresh 토큰 사용
# urls.py
from django.urls import path
from rest_framework_simplejwt.views import TokenRefreshView
urlpatterns = [
...
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
'Django' 카테고리의 다른 글
Django : backend framework(6) (0) | 2024.03.19 |
---|---|
마이그레이션 : 관련 모델이나 필드가 해석되지 못할 때 (0) | 2024.03.19 |
Django : backend framework(5) (0) | 2024.03.19 |
Django : backend framework(4) (0) | 2024.03.18 |
Django : backend framework(3) (0) | 2024.03.15 |