HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 규약이다.

서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다.
key - value 형식의 데이터이다.

key - value 의 데이터 형식으로 저장한다.Set-Cookie 필드를 통해 클라이언트에게 쿠키를 전송한다.Header 의 Cookie 필드에 저장된 쿠키를 함께 전송한다.서버 측에서 생성되어 클라이언트와 서버 간의 상태를 유지하고, 상태 정보를 저장하는 데이터 저장 방식이다.
session id를 만든다.session id를 브라우저에게 보내준다.session id를 쿠키에 저장한다.session id를 서버에 같이 보낸다.session id를 확인해서 "로그인한 사용자"라고 판단한다.

session id 를 저장하여 매 요청마다 session id 를 함께 보낸다.| 구분 | 쿠키 | 세션 |
|---|---|---|
| 저장 위치 | 클라이언트(브라우저) | 서버 |
| 저장하는 것 | 사용자 정보 또는 세션 ID | 로그인 정보 등 세션 데이터 |
| 목적 | 사용자를 기억하고 상태를 유지 | 사용자를 식별하고 로그인 상태를 유지 |
| 요청 시 | 브라우저가 서버에 쿠키를 같이 보냄 | 서버가 쿠키의 세션 ID를 보고 세션을 찾음 |
| 쉽게 말하면 | 브라우저가 들고 있는 정보/번호표 | 서버가 보관하는 사용자 정보 |
둘 다 결국 클라이언트와 서버 사이의 상태 정보를 유지하고, 사용자를 식별하기 위해 사용한다.
예를 들면:
로그인 상태 유지, 사용자 구분, 장바구니 정보 유지 등에 사용한다.
쿠키 = 클라이언트에 저장
세션 = 서버에 저장
공통 목적 = 상태 유지 + 사용자 식별
웹에서는 클라이언트와 서버가 여러 번 요청과 응답을 주고받기 때문에, 서버는 각 요청이 어떤 사용자에게서 온 것인지 구별할 필요가 있다.
이때 사용자가 누구인지 확인하는 과정을 인증(Authentication) 이라고 한다.
대표적인 인증 방식
인증은 사용자가 누구인지 확인하기 위해 필요하다.
Django는 사용자 인증과 관련된 기능을 모아둔 시스템을 기본으로 제공한다.
주요 기능
Django Authentication System을 이용하면 로그인, 로그아웃, 회원가입, 회원정보 수정과 같은 기능을 구현할 수 있다.
Django는 기본적으로 내장된 User Model을 제공한다.
하지만 기본 User Model은 username, password 등 기본적인 필드만 제공하기 때문에, 생년월일, 주소, 나이 등 추가 사용자 정보가 필요한 경우 확장이 어렵다.
실제 프로젝트에서는 요구사항 및 필요한 사용자 정보를 추가하기 위해 기본 User Model을 그대로 사용하기보다 Custom User Model을 만들어 사용하는 것이 좋다.
Django 프로젝트의 User를 나타내는데 사용하는 모델을 지정하는 속성이다.
프로젝트 중간에 AUTH_USER_MODEL 을 변경하는 것을 강력하게 권장하지 않는다. → 이미 프로젝트가 진행되고 있을 경우 DB 초기화 후 진행해야 한다.
app accounts 생성 및 등록
auth와 관련한 경로나 키워드들을 django 내부적으로accounts라는 이름을 사용하고 있기 때문에 되도록accounts로 지정하는 것을 권장한다.
# accounts 앱 생성
python .\manage.py startapp accounts
# 마이그레이션
python manage.py makemigrations
#마이그레이트
python manage.py migrate

models.py에 AbstractUser 클래스를 상속받는 커스텀 User 클래스를 작성한다.from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
User 모델을 우리가 작성한 User 모델을 사용할 수 있도록 AUTH_USER_MODEL 값을 변경한다.AUTH_USER_MODEL = "auth.User" 를 사용하기 때문에 설정을 따로 작성해야 한다.AUTH_USER_MODEL = "accounts.User"
admin에 새로 등록을 해주어야 한다.from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
db.sqlite3 삭제 후 새로 마이그레이션, 마이그레이트auth_user 를 accounts_user 로 교체하려면 기존 db.sqlite3 를 삭제하고 새로 마이그레이션 → 마이그레이트를 하면 auth 가 accounts 로 바뀐다.
로그인 = 사용자가 자신이 누구인지 서버에 인증하는 과정
로그인에 성공하면 서버는 사용자의 세션을 만들고, 그 세션을 찾기 위한 Session ID를 발급한다.

Django에서는 로그인 인증에 사용할 수 있도록 AuthenticationForm이라는 기본 Form을 제공한다.
AuthenticationForm은 사용자가 로그인할 때 입력하는
usernamepassword값을 입력받고 인증하는 역할을 한다.
AuthenticationForm은 일반적인 ModelForm이 아니라 일반 Form을 상속받은 Form이다.
import는 다음과 같이 작성
from django.contrib.auth.forms import AuthenticationForm
먼저 사용자가 로그인 페이지에 접근할 수 있도록 URL을 작성한다.
app_name = 'accounts'
urlpatterns = [
path("login/", views.login, name="login"),
]
/accounts/login/ 주소로 요청이 들어오면 views.login 함수가 실행된다.
로그인 페이지에 사용할 AuthenticationForm을 생성한 뒤 템플릿으로 전달한다.
from django.shortcuts import render
from django.contrib.auth.forms import AuthenticationForm
# 로그인은 세션을 Create하는 로직
def login(request):
# POST 요청이면 로그인 인증 및 세션 생성
if request.method == "POST":
pass
# GET 요청이면 로그인 폼 출력
else:
form = AuthenticationForm()
context = {
"form": form,
}
return render(request, "accounts/login.html", context)
GET 요청이 들어왔을 때 AuthenticationForm()을 생성하여 로그인 페이지에 전달한다.
View에서 전달받은 form을 템플릿에서 출력한다.
<body>
<h1>로그인</h1>
<form action="{% url 'accounts:login' %}" method="POST">
{% csrf_token %}
{{ form }}
<input type="submit" value="로그인">
</form>
</body>
{{ form }}을 작성하면 Django가 AuthenticationForm에 정의된 username, password 입력창을 자동으로 만들어준다.
로그인은 서버의 세션 상태를 변경하는 요청이므로 POST 방식으로 요청한다.
method="POST"
POST 요청에서는 CSRF 공격을 방지하기 위해 아래 코드도 작성한다.
{% csrf_token %}
사용자가 아이디와 비밀번호를 입력하고 로그인 버튼을 누르면 같은 login 함수로 POST 요청이 들어온다.
사용자가 입력한 데이터는 request.POST에 들어있다.
form = AuthenticationForm(request, request.POST)
입력한 정보가 올바른지 유효성 검사를 확인한다.
if form.is_valid():
인증에 성공하면 로그인한 사용자 정보를 가져온다.
user = form.get_user()
이후 Django가 제공하는 login() 함수를 이용해 세션을 생성한다.
auth_login(request, user)
Django의 login 함수와 커스텀 login 함수의 이름이 겹칠 수 있기 때문에, Django의 로그인 함수는 auth_login이라는 이름으로 import한다.
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login
def login(request):
# 로그인 요청
if request.method == "POST":
form = AuthenticationForm(request, request.POST)
if form.is_valid():
user = form.get_user()
# 세션 생성
auth_login(request, user)
return redirect("articles:index")
# 로그인 페이지 요청
else:
form = AuthenticationForm()
context = {
"form": form,
}
return render(request, "accounts/login.html", context)

