장고 로그인 시스템 이해하기

소요 시간: 3분

1. Django 로그인 흐름 요약

Django에서 사용자의 인증과 로그인 상태 유지를 위해 핵심적으로 사용하는 두 가지 함수는 authenticate()와 login()이다. 이들은 사용자의 신원을 확인하고 세션을 통해 로그인 상태를 유지하는 데 중추적인 역할을 한다.


2. 주요 개념 및 프로세스 설명

우선, authenticate() 함수. 사용자가 입력한 자격 증명(예: 사용자 이름과 비밀번호)을 확인하는 함수다.

authenticate()는 username과 password를 기반으로, Django에 설정된 AUTHENTICATION_BACKENDS를 통해 사용자의 유효성을 검증한다.

인증에 성공하면 User 객체를 반환하며, 실패하면 None을 반환한다.

from django.contrib.auth import authenticate
user = authenticate(request, username='example', password='password123')
if user is not None:
    # 인증 성공
else:
    # 인증 실패

authenticate()로 성공적으로 인증된 User 객체를 login() 함수를 통해 세션에 연결한다. 이를 통해 사용자는 "로그인" 상태가 된다. Django는 사용자의 정보를 세션에 저장하고, 이후의 요청에서도 인증된 사용자로 간주한다.

from django.contrib.auth import login
if user is not None:
    login(request, user)  # 사용자 세션 연결

login() 함수가 호출되면 Django는 사용자를 세션에 저장하여 이후 모든 요청에서 request.user를 통해 해당 사용자를 참조할 수 있다.

즉, 로그인된 상태를 유지하면서 웹사이트를 탐색할 수 있게 된다. 사용자가 브라우저를 닫거나 명시적으로 로그아웃하지 않는 이상, 사용자는 인증된 상태로 머무른다.


3. 백엔드 사용과 커스텀 백엔드 설정

Django는 기본적으로 AUTHENTICATION_BACKENDS 설정을 통해 여러 백엔드를 지원한다.

예를 들어, 기본적으로 ModelBackend가 사용자 인증에 사용되며, 필요에 따라 커스텀 백엔드를 설정할 수도 있다.

settings.py에서 설정된 인증 백엔드는 다음과 같이 사용할 수 있다.

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',  # 기본 백엔드
    'path.to.custom.backend.CustomBackend',       # 커스텀 백엔드
]

새로운 인증 로직을 정의하려면 BaseBackend를 상속하여 커스텀 백엔드를 만들 수 있다.

from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.models import User

class CustomBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None


4. 실용적 사용 예제

from django.contrib.auth import authenticate, login
from django.shortcuts import redirect

def user_login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return redirect('home')  # 인증된 사용자의 메인 페이지로 리다이렉트
    else:
        return redirect('login_error')  # 인증 실패 시 에러 처리


5. 정리

장고 리스트