(Django) 로그인 시 cookie에 token 저장하기

Kepler·2020년 4월 15일
3

유저가 로그인에 성공했을때, 해당 유저를 로그인 기간동안 인증하는 토큰을 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)

Request header 정보

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)

업데이트된 Request header

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/

profile
🔰

0개의 댓글