[django] 로그인/로그아웃 처리 과정

7934 단어 djangodjango

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

좋은 웹페이지 즐겨찾기