Django REST Framework에서 OAuth 토큰 안전하게 저장 및 로그아웃 처리

김재섭·2025년 3월 8일
post-thumbnail

🔹 OAuth 토큰을 안전하게 저장하는 방법

소셜 로그인 후 클라이언트에서 받은 액세스 토큰(access token)과 Django에서 발급된 JWT 토큰을 어떻게 저장하느냐는 보안과 사용자 경험에 큰 영향을 미친다.
일반적으로 클라이언트(React, Vue 등)에서 이를 처리하는 방법은 두 가지로 나뉜다:

  1. Local Storage 사용

    • 장점: 구현이 간단하고 브라우저에서 쉽게 접근 가능.
    • 단점: XSS(크로스 사이트 스크립팅) 공격에 취약할 수 있음.
    • 권장되지 않음: 민감한 토큰을 저장하기엔 보안 위험이 크다.
  2. HttpOnly 쿠키 사용

    • 장점: JavaScript로 접근할 수 없어 XSS 공격으로부터 안전.
    • 단점: CSRF(사이트 간 요청 위조) 공격에 대비해야 함.
    • 추천: Django와 DRF에서 HttpOnly 쿠키를 활용하면 보안성을 높일 수 있다.

✅ Django에서 HttpOnly 쿠키 설정

settings.py에서 JWT 토큰을 쿠키로 반환하도록 설정하자.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'AUTH_COOKIE': 'access_token',  # 쿠키 이름
    'AUTH_COOKIE_SECURE': True,  # HTTPS에서만 전송
    'AUTH_COOKIE_HTTP_ONLY': True,  # JavaScript 접근 차단
    'AUTH_COOKIE_SAMESITE': 'Lax',  # CSRF 방어
}

이렇게 설정하면 /auth/social/login/ 엔드포인트 호출 시 JWT 액세스 토큰이 HttpOnly 쿠키로 클라이언트에 저장된다.
클라이언트는 별도로 토큰을 관리할 필요 없이 요청 시 쿠키가 자동으로 서버에 전송된다.


🔹 로그아웃 처리

소셜 로그인 후 발급된 JWT 토큰을 무효화하고 로그아웃을 구현하려면, 리프레시 토큰(refresh token)을 활용해 토큰을 블랙리스트에 추가하는 방식이 일반적이다.

✅ 로그아웃 API 구현

dj-rest-authrest_framework_simplejwt를 사용할 경우, 로그아웃은 다음과 같이 처리할 수 있다.

  1. URL 설정
urlpatterns = [
    path('auth/logout/', include('dj_rest_auth.logout.urls')),
]
  1. 로그아웃 요청
    클라이언트에서 리프레시 토큰을 서버로 보내 블랙리스트에 추가한다.
POST /auth/logout/
Content-Type: application/json

{
  "refresh": "REFRESH_TOKEN"
}
  1. 블랙리스트 활성화
    settings.py에 블랙리스트 설정을 추가한다.
SIMPLE_JWT = {
    ...
    'BLACKLIST_AFTER_ROTATION': True,
}

INSTALLED_APPS += ['rest_framework_simplejwt.token_blacklist']

이렇게 하면 로그아웃 시 리프레시 토큰이 무효화되고, 해당 토큰으로 더 이상 액세스 토큰을 갱신할 수 없게 된다.


✅ 정리

  • 토큰 저장: HttpOnly 쿠키를 사용해 XSS 공격으로부터 안전하게 토큰을 관리하자.
  • 로그아웃: 리프레시 토큰을 블랙리스트에 추가해 안전하게 세션을 종료하자.
  • 추가로 CSRF 토큰을 함께 사용하면 보안이 한층 강화된다.

이 설정을 적용하면 소셜 로그인 기반의 안전한 인증 시스템을 DRF에서 구축할 수 있다!
다음 글에서는 커스텀 사용자 모델과 소셜 로그인 연동에 대해 다뤄보겠습니다.

profile
Upward Developer

0개의 댓글