유저가 로그인에 성공했을때, 해당 유저를 로그인 기간동안 인증하는 토큰을 cookie에 저장해야 할 경우, HttpResponse
또는 JsonResponse
에장고에서 제공하는 set_cookie
메소드를 사용하여, 토큰을 발행할 수 있다. 인자는 파이썬에서 제공하는 Morsel objects의 것과 같다.
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
Http request header를 출력해보면 header에는 대략 다음과 같은 정보가 담겨있다.
{
'Content-Length': '44', 'Content-Type': 'application/json', 'Host': '127.0.0.1:8000',
'Connection': 'keep-alive', 'Accept': 'application/json, text/javascript, */*; q=0.01',
'Sec-Fetch-Dest': 'empty', 'X-Csrftoken': 'tokeninfo', 'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Origin': 'http://127.0.0.1:8000', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors', 'Referer': 'http://127.0.0.1:8000/login/',
'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6,zh-CN;q=0.5,zh;q=0.4,fr;q=0.3',
'Cookie': 'csrftoken=csrftoken; sessionid=session info'
}
set_cookie
를 사용하면 발행한 토큰 정보가 'Cookie'
라는 key의 value로써 저장되게 된다. 장고의 auth를 사용하는 경우 csrftoken이 이미 들어가 있다. 로그인 토큰은 그 뒤에<로그인토큰>=<발행한토큰>
의 형식으로 추가로 발행되게 된다.
access_token = jwt.encode({'username': user.username}, SECRET_KEY, algorithm = ALGORITHM).decode('utf-8')
res = JsonResponse({'success':True})
res.set_cookie('access_token', access_token)
access_token
이 추가 된 것을 확인 할 수 있다.
이제 위의 토큰을 인증하는 decorator 코드를 작성하여, 각각의 API에 붙여주면 토큰을 통한 유저 인증이 가능하다.
로그아웃할때는 앞서 발행한 토큰 대신에 빈값을 넣어주면 된다.
@login_decorator
def user_logout(request):
# reset the token
reset = ''
res = JsonResponse({'success':True})
res.set_cookie('access_token', reset)
return res
참고문서
장고 공식문서: https://docs.djangoproject.com/en/3.0/ref/request-response/