[django] 로그인/로그아웃 처리 과정
django에서 로그인/로그아웃이 처리되는 과정을 좀 더 자세히 알아보기
로그인 과정
이전에 만들었던 쇼핑몰 프로젝트에서는 다음과 같은 코드에 의해 로그인이 진행된다.
# user/views.py
from django.contrib.auth import authenticate, login
...
def login_form(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
current_user =request.user
userprofile=UserProfile.objects.get(user_id=current_user.id)
return HttpResponseRedirect('/')
else:
messages.warning(request,"아이디 혹은 패스워드 오류입니다!")
return HttpResponseRedirect('/login')
context = {}
return render(request, 'user/login.html', context)
django.contrib.auth 모듈의 아래 두 함수가 로그인 처리에 사용된다.
authenticate(request=None, **credentials)
- 자격증명(credential, 위에서는 username과 password)을 인자로 받아 유효한지 확인하고 유효하면 user를 반환, 아니면 None을 반환하는 함수
login(request, user, backend=None)
- authenticate 함수를 통해 user가 인증된 후, login 함수는 user(클라이언트) 정보를 DB의 django _session 테이블에 저장하는데 이때 session_key, session_data, expire_date 열이 각각 생성된다.로그인 후 DB에 새로 저장된 session 데이터
- session_key : session의 key
- session_data : session key에 대한 value
- expire_date : session 만료 시간
로그인 후 브라우저 cookie에 저장된 session id
- 크롬 개발자도구 application -> storage -> cookies 에 들어가면 sessionid를 확인할 수 있는데 이 값은 DB에 저장된 session_key와 같다.
- 이 sessionid(key)를 브라우저와 django session이 동시에 가지고 있기 때문에 유저가 로그인을 지속할 수 있게 된다.
로그아웃 과정
로그아웃을 하면 각각 나누어 갖고 있는 session 정보를 삭제하게 된다.
# django/contrib/auth/__init__.py
def logout(request):
"""
Remove the authenticated user's ID from the request and flush their session
data.
"""
# Dispatch the signal before the user is logged out so the receivers have a
# chance to find out *who* logged out.
user = getattr(request, 'user', None)
if not getattr(user, 'is_authenticated', True):
user = None
user_logged_out.send(sender=user.__class__, request=request, user=user)
request.session.flush()
if hasattr(request, 'user'):
from django.contrib.auth.models import AnonymousUser
request.user = AnonymousUser()
django.contrib.auth 모듈에 있는 logout 함수이다.
request.session.flush()
에서 flush 메서드는 브라우저와 DB 양쪽에 저장된 session 데이터를 삭제하는 역할을 한다.
[참고] https://arotein.tistory.com/27
Author And Source
이 문제에 관하여([django] 로그인/로그아웃 처리 과정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dhleeone/django로그인로그아웃-처리-과정-JWT저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)