# DRF 기본 인증/권한 설정
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
기본적으로 로그인 API를 사용중인 Dj-Rest-Auth는 Token 기반 인증을 사용합니다.
참고 문서를 보니 사용하는 로그인 라이브러리에 따라 Token 기반 인증에 사용되는 옵션이 다른 것 같았습니다.
현재 프로젝트에서는 Dj-Rest-Auth의 로그인 API를 사용하고 있습니다.
Django에서 토큰 기반 인증옵션이 다향하게 있는데 그중 세가지만 추려보았습니다.
저장 위치: 서버 발급 고유 토큰.
보안 및 갱신: 영구적 토큰, 기본적인 만료 및 갱신 기능 없음.
편의성: 간단한 설정과 구현.
저장 위치: JWT를 HTTPOnly 쿠키에 저장.
보안 및 갱신: XSS 공격에 강함, CSRF 방어 필요, 기본적으로 자체 토큰 갱신 기능 없음.
편의성: 쿠키 기반 인증을 통해 클라이언트 측 스크립트에서 접근할 수 없으며, 자동으로 쿠키를 포함하여 요청합니다.
저장 위치: JWT를 HTTP Authorization 헤더에 저장.
보안 및 갱신: Access/Refresh 토큰으로 보안 강화, 토큰 갱신 기능 제공.
편의성: 토큰은 일반적으로 클라이언트의 로컬 스토리지나 세션 스토리지에 저장되며, 클라이언트는 매 요청마다 헤더에 토큰을 포함시켜 서버에 전송합니다.
[참고] HttpOnly 쿠키란 무엇인가요?
HttpOnly 쿠키는 클라이언트 측 스크립트(JavaScript)에서 접근할 수 없도록 설정된 쿠키입니다. 이 쿠키는 웹 브라우저를 통해서만 전송되며, document.cookie 같은 JavaScript 코드로는 접근할 수 없습니다. 이는 보안 강화(XSS 공격 방지)를 위해 사용됩니다.
자체적으로 토큰 갱신기능과 access token, refresh tokem 발급이 가능한 rest_framework_simplejwt.authentication.JWTAuthentication를 사용하기로 하였습니다.
1.보안 강화
짧은 수명의 Access 토큰: Access 토큰의 유효 기간을 짧게 설정하여 토큰이 도난당하더라도 피해를 최소화할 수 있습니다.
Refresh 토큰 사용: Refresh 토큰을 통해 새로운 Access 토큰을 발급받아 지속적인 세션 유지가 가능하며, Refresh 토큰은 보통 더 긴 유효 기간을 가집니다.
2.사용자 경험 개선
자동 로그인 유지: 사용자가 재로그인할 필요 없이 세션을 연장할 수 있습니다.
무중단 서비스 제공: 유효한 Refresh 토큰을 통해 Access 토큰을 갱신함으로써 중단 없는 서비스 이용이 가능합니다.
3.관리 용이
블랙리스트 관리: Refresh 토큰을 블랙리스트에 추가하여, 토큰 도난 시 토큰을 무효화할 수 있습니다.
회전식 토큰: 토큰 갱신 시 새로운 Refresh 토큰을 발급하여 보안을 유지하고 관리할 수 있습니다.
JWT 설정 이후에도 dj_rest_auth.jwt_auth.JWTCookieAuthentication에서 발급하는 토큰이 아닌 기본 토큰 1개만 발급되는 것을 확인하였습니다.
관련 설정만 몇번을 반복해서 보았는지 모르겠습니다,,
그러다가 'django dj_rest_auth jwt 오류'를 검색하여 찾은 블로그를 통해 문제를 해결할 수 있었습니다.
문제의 원인은 dj_rest_auth의 버젼 문제였습니다. 뒤늦게 JWT 인증 구현을 위해 참고했던 글들을 확인하였더니 최소 2-3년전 내용이었습니다,,
이전에는 오류가 발생하면 버젼에 대해 크게 신경쓰지 않았지만 앞으로는 우선 고려사항으로 생각해야겠습니다. ༼;´༎ຶ ༎ຶ`༽
버젼 업데이트를하면서 dj_rest_auth의 JWT 설정 양식이 변경되었습니다.
# 이전 버젼
REST_USE_JWT = True
# 현재 버젼
REST_AUTH = {
"USE_JWT": True,
"JWT_AUTH_HTTPONLY": True,
"JWT_AUTH_REFRESH_COOKIE": "refresh_token",
"JWT_AUTH_COOKIE_USE_CSRF": True,
"SESSION_LOGIN": False,
}
코드와 같이 사전구조를 통해 관련설정이 모두 하나로 통합되었습니다.
JWT_AUTH_HTTPONLY : 쿠키를 http only로 할건지 여부 (기본 True)
JWT_AUTH_REFRESH_COOKIE : refresh token을 담을 쿠키 이름 (기본 None)
JWT_AUTH_COOKIE_USE_CSRF : JWT 쿠키 csrf 검사
SESSION_LOGIN: 세션 로그인 기능 (기본 True)