장고 로그인 시스템 이해하기
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. 정리
- authenticate()는 사용자의 자격 증명을 확인하는 단계다.
- login()은 성공적으로 인증된 사용자를 세션에 연결하여 인증된 상태를 유지하게 한다.
- request.user는 로그인 후 사용자의 세션 정보를 포함하여 이후 요청에서도 접근 가능한 속성으로, 인증 여부를 확인할 수 있다.
- 세션은 브라우저가 닫히거나 logout()을 호출하기 전까지 유지되며, 이를 통해 사용자는 지속적으로 로그인 상태를 경험하게 된다.