웹(WWW)에서 이루어지는 모든 데이터 교환의 기초
클라이언트 측에서 저장되는 작은 데이터 파일이며, 사용자 인증, 추적, 상태 유지 등에 사용되는 데이터 저장 방식
쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용됨
쿠키에 세션 데이터를 저장하여 매 요청시마다 세션 데이터를 함께 보냄
예를 들어 로그인 상태 유지를 위해 로그인 되어있다는 사실을 입증하는 데이터를 매 요청마다 계속해서 보내는 것
Django는 우리가 session 매커니즘(복잡한 동작원리)에 대부분을 생각하지 않게끔 많은 도움을 줌
사용자가 자신이 누구인지 확인하는 것(신원 확인)
사전 준비
django가 기본적으로 제공하는 User model이 아닌 직접 작성한 User model을 사용하기 위해
내장된 auth 앱에 작성된 User 클래스를 사용했음

별도의 설정 없이 사용할 수 있어 간편하지만, 개발자가 직접 수정할 수 없는 문제가 존재
https://github.com/django/django/blob/main/django/contrib/auth/models.py#L406
기존 User 클래스도 AbstractUser를 상속받기 때문에, 이렇게 하면 커스텀 User 클래스도 기존 User 클래스와 완전히 같은 모습을 가지게 됨.
# accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
# settings.py
AUTH_USER_MODEL = 'accounts.User'
# accounts/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdming
from .models import User
admin.site.register(User, UserAdmin)
Django 프로젝트의 User를 나타내는 데 사용하는 모델을 지정
프로젝트 중간에 AUTH_USER_MODEL을 변경할 수 없음
Django는 새 프로젝트를 시작하는 경우 (기본 User 모델이 충분하더라도) 커스텀 User 모델을 설정하는 것을 강력하게 권장하고 있음
커스텀 User 모델은 기본 User 모델과 동일하게 작동 하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문
단, User 모델 대체 작업은 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 함
accounts/urls.py
app_name = 'accounts' urlpatterns = [ path('login/', views.login, name='login'), ]
accounts/login.html
<h1>로그인<h1> <form action="{% url 'accounts:login' %}" method="POST"> {% csrf_token %} {{ form.as_p }} <input type="submit"> </form>
accounts/views.py
from django.contrib.auth.forms import AuthenticationForm def login(request): if request.method == 'POST': form = AuthenticationForm(request, data=request.POST) if form.is_valid(): auth_login(request, form.get_user()) return redirect('articles:index') else: form = AuthenticationForm() context = { 'form': form, } return render(request, 'accounts/login.html', context)
유효성 검사를 통과했을 경우 로그인 한 사용자 객체를 반환
accounts/urls.py
urlpatterns = [ path('login/', views.login, name='login'), path('logout/', views.logout, name='logout'), ]
articles/index.html
<h1>Articles</h1> <a href="{% url 'accounts:login' %}">Login</a> <form action="{% url 'accounts:logout' %} method="POST"> {% csrf_token %} <input type="submit" value="Logout"> </form>
accounts/views.py
from django.contrib.auth import logout as auth_logout def logout(request): auth_logout(request) return redirect('articles:index')
settings.py
TEMPLATE = [
{
...,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]

def signup(request):
if request.method =="POST":
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('articles:index')
else:
form = UserCreationForm()
Context = {
'form': form,
}
return render(request, 'accounts/signup.html', context)
대체한 유저 모델로 변경 필요
get_user_model()
User model 참조에 대한 자세한 내용은 추후 모델 관계에서 다룰 예정
# accounts/views.py
from .forms import CustomUserCreationForm
def signup(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('articles:index')
else:
form = CustomUserCreationForm()
context = {
'form': form,
}
return render(request, 'accounts/signup.html', context)


CustomUserChangeForm에서 접근 가능한 필드를 다시 조정


update_session_auth_hash(request, user)
암호가 변경되면 새로운 password의 Session Date로 기존 session을 자동으로 갱신
모든 User 인스턴스에 대해 항상 True인 읽기 전용 속성이며, 비인증 사용자에 대해서는 항상 False
비인증 사용자의 경우 /accounts/login/ 주소로 redirect 시킴