
소셜 로그인 후 클라이언트에서 받은 액세스 토큰(access token)과 Django에서 발급된 JWT 토큰을 어떻게 저장하느냐는 보안과 사용자 경험에 큰 영향을 미친다.
일반적으로 클라이언트(React, Vue 등)에서 이를 처리하는 방법은 두 가지로 나뉜다:
Local Storage 사용
HttpOnly 쿠키 사용
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)을 활용해 토큰을 블랙리스트에 추가하는 방식이 일반적이다.
dj-rest-auth와 rest_framework_simplejwt를 사용할 경우, 로그아웃은 다음과 같이 처리할 수 있다.
urlpatterns = [
path('auth/logout/', include('dj_rest_auth.logout.urls')),
]
POST /auth/logout/
Content-Type: application/json
{
"refresh": "REFRESH_TOKEN"
}
settings.py에 블랙리스트 설정을 추가한다. SIMPLE_JWT = {
...
'BLACKLIST_AFTER_ROTATION': True,
}
INSTALLED_APPS += ['rest_framework_simplejwt.token_blacklist']
이렇게 하면 로그아웃 시 리프레시 토큰이 무효화되고, 해당 토큰으로 더 이상 액세스 토큰을 갱신할 수 없게 된다.
HttpOnly 쿠키를 사용해 XSS 공격으로부터 안전하게 토큰을 관리하자. 이 설정을 적용하면 소셜 로그인 기반의 안전한 인증 시스템을 DRF에서 구축할 수 있다!
다음 글에서는 커스텀 사용자 모델과 소셜 로그인 연동에 대해 다뤄보겠습니다.