[Team 22] DRF Authentication - dj-rest-auth
소셜 로그인 기능을 추후에 쉽게 추가하기 위해서 dj-rest-auth를 사용해 회원가입, 로그인 기능을 구현해보도록 하자.
사실 원래는 simple jwt를 활용해서 토큰을 발급하고 쿠키에 저장해두는 방식으로 구현하려고 했는데, 이것저것 찾아보니 소셜 로그인 구현 시에 정신건강에 상당히 위협적인 스케일로 일이 커질 수 있다는 슬픈소식에... dj-rest-auth를 함께 사용하도록 한다.
https://dj-rest-auth.readthedocs.io/en/latest/index.html
Install
pip install django-rest-auth
pip install django-allauth
Settings.py
다음 코드들을 settings.py에 추가한다.
INSTALLED_APPS = (
'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'dj_rest_auth'
'dj_rest_auth.registration',
'allauth',
'allauth.account',
'allauth.socialaccount',
)
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': [
'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
"rest_framework.authentication.SessionAuthentication",
...
],
}
REST_AUTH = {
'USE_JWT': True,
'JWT_AUTH_COOKIE': 'my-app-auth',
# want refresh token
'JWT_AUTH_REFRESH_COOKIE': 'my-refresh-token',
# set refresh token http only (security essue)
'JWT_AUTH_HTTPONLY': False,
# JWT 쿠키 csrf 검사
'JWT_AUTH_COOKIE_USE_CSRF' : True,
# set Session login false : if true, sessionid remains in cookie info
'SESSION_LOGIN' : False
}
JWT_AUTH_REFRESH_COOKIE를 설정하지 않으면 refresh_token을 응답받지 못한다. (로그인 시 refresh_token이 빈칸으로 나온다.)
JWT_AUTH_HTTPONLY는 기본으로 true로 설정되어있다. 따라서 이 부분을 false로 바꿔줘야 access와 refesh token을 모두 응답밪을 수 있다.
문제는, 보안상 이슈가 크기 때문에 refresh token은 csrf검사를 하도록 설정하고, 쿠키에는 저장되지 않게 해야 한다.
따라서 SESSION_LOGIN 은 false로, JWT_AUTH_COOKIE_USE_CSRF는 true로 설정한다.
JWT_AUTH = {
'JWT_ALLOW_REFRESH': True,
# JWT 토큰의 유효기간 설정
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
# JWT 토큰 갱신의 유효기간
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=28),
}
Urls.py
프로젝트 폴더(settings가 있는)의 urls.py에 다음을 추가한다.
urlpatterns = [
...
path('dj-rest-auth/', include('dj_rest_auth.urls')),
path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
]
Migrate
settings의 INSTALLED_APPS를 수정했기 때문에 migration을 진행해야 한다.
python manage.py migrate
동작 확인
runserver로 동작이 정상적으로 진행되는지 알아보자
python manage.py runserver
이제 /dj-rest-auth/로 들어가보자.
8번부터 16번까지의 URL이 잘 뜨면 일단 성공이다!
.
dj-rest-auth/registration/
POST를 누르면 성공적으로 회원가입이 완료된다.
회원가입이 완료되면 access token과 refresh token이 잘 뜨는걸 알 수 있다.
dj-rest-auth/login/
이제 로그인 기능을 확인하자
유저와 비밀번호를 입력한다. POST를 눌러보면 아래와 같이 성공적으로 로그인 된다.
dj-rest-auth/user/
로그인된 유저의 정보를 확인해보자 127.0.0.1:8000/dj-rest-auth/user/ 로 접근을 하면 유저의 정보를 확인할 수 있다.
dj-rest-auth/logout/
이제 로그아웃해보자.
아래의 POST를 눌러보면
로그아웃되었다!