Cookie & Session
- 우리가 서버로부터 받은 페이지를 둘러볼 때 우리는 서버와 서로 연결되어 있는 상태가 아니다.
- 목적 : 서버와 클라이언트 간의 '상태'를 유지
HTTP
- HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 규약
- 웹(WWW)에서 이루어지는 모든 데이터 교환의 기초
HTTP 특징
- 비 연결 지향(connectionless)
- 서버는 요청에 대한 응답을 보낸 후 연결을 끊음
- 무상태(stateless)
- 연결을 끊는 순간 클라이언트와 서버 간의 통시이 끝나며 상태 정보가 유지되지 않음
Cookie
- 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각
- 클라이언트 측에서 저장되는 작은 데이터 파일이며, 사용자 인증, 추적, 상태 유지 등에 사용되는 데이터 저장 방식
Cookie 사용 원리
- 브라우저는 쿠키를 KEY-VALUE의 데이터 형식으로 저장
- 쿠키를 저장해 놓았다가, 동인한 서버에 재요청 시 저장된 쿠키를 함께 전송
- 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용됨
- 이를 이용해 사용자의 로그인 상태를 유지
- 상태가 없는 HTTP 프로토콜에서 상태 정보를 기억시켜 주기 때문
Cookie 사용 목적
- 세션 관리
- 로그인, 아이디 자동완성, 공지 하루 안 보기 등
- 개인화
- 트래킹
Session
- 서버 측에서 생성되어 클라이언트와 서버 간의 상태를 유지 상태 정보를 저장하는 데이터 저장 방식
- 쿠키에 세션 데이터를 저장하여 매 요청시마다 세션 데이터를 함께 보냄
Session 작동 원리
- 클라이언트가 로그인을 하면 서버가 session 데이터를 생성 후 저장
- 생성된 session 데이터에 인증 할 수 있는 session id를 발급
- 발급한 session id를 클라이언트에게 응답
- 클라이언트는 응답 받은 session id를 쿠키에 저장
- 클라이언트가 다시 동일한 서버에 접속하면 요청과 함께 쿠키를 서버에 전달
- 쿠키는 요청 때마다 서버에 함께 전송 되므로 서버에서 session id를 확인해 로그인 되어있다는 것을 알도록 함
Cookie 종류별 Lifetime
- Session cookie
- 현재 세션이 종료되면 삭제됨
- 브라우저 종료와 함께 세션이 삭제됨
- Persistent cookies
- Expires 속성에 지정된 날짜 혹은 Max-Age 속성에 지정된 기간이 지나면 삭제됨
Authentication system
- 사용자 인증과 관련된 기능을 모아 놓은 시스템
Authentication
Custom User model 대체하기
- django가 기본적으로 제공하는 User model이 아닌 직접 작성한 User model을 사용하기 위해
User 클래스를 대체하는 이유
- 우리는 지금까지 별도의 User 클래스 정의 없이 내장된 auth 앱에 작성된 User 클래스를 사용했음
- 별도의 설정 없이 사용할 수 있어 간편하지만, 개발자가 직접 수정할 수 없는 문제가 존재
AUTH_USER_MODEL
- Django 프로젝트의 User를 나타내는 데 사용하는 모델을 지정
프로젝트 시작 시 반드시 User 모델을 대체해야 한다
- Django는 새 프로젝트를 시작하는 경우 커스텀 User 모델을 설정하는 것을 강력하게 권장
- 커스텀 User 모델은 기본 User 모델과 동일하게 작동 하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문
Login & Logout
Login
- 로그인 인증에 사용할 데이터를 입력받는 built-in form
app_name = 'accounts'
urlpatterns = [
path('login/', views.login, name='login'),
]
<h1>로그인</h1>
<form action="{% url 'accounts:update' %}" method = "POST">
{% csrf_token %}
{{form.as_p}}
<input type = "submit">
</form>
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():
auth_login(request, form.get_user())
return redirect('articles:index')
else:
form = AuthenticationForm()
context = {
'form': form,
}
return render(request, 'accounts/login.html', context)
login(request, user)
- AuthenticationForm을 통해 인증된 사용자를 로그인 하는 함수
get_user()
- AuthenticationForm의 인스턴스 메서드
- 유효성 검사를 통과했을 경우 로그인 한 사용자 객체를 반환
Logout
logout(request)
- 현재 요청에 대한 Session Data를 DB에서 삭제
- 클라이언트의 쿠키에서도 Session Id를 삭제
app_name = 'accounts'
urlpatterns = [
path('logout/', views.logout, name='logout'),
]
<h1>Articles</h1>
<a href = "{% url 'accounts:login %}">Login </a>
<form action="{% url 'accounts:update' %}" method = "POST">
{% csrf_token %}
{{form.as_p}}
<input type = "submit" value="Logout">
</form>
from django.contrib.auth import logout as auth_logout
from django.contrib.auth.forms import AuthenticationForm
def logout(request):
auth_logout(request)
return redirect('articles:index')
Template with Authenication data