
Django Session
Django는 로그인 상태를 유지하기 위해 Session 기능을 제공한다.
Session은 사용자의 상태 정보를 서버에 저장하여 HTTP의 무상태성(Stateless)을 해결하는 역할을 한다.
HTTP의 무상태성(stateless)
- 서버가 클라이언트의 이전 요청에 대한 상태 정보를 저장하지 않는 특성
- 각 요청은 독립적이며, 서버는 요청마다 클라이언트를 식별할 수 있어야 함
HTTP는 기본적으로 상태를 저장하지 않는 프로토콜이다.
즉, 서버는 이전 요청을 기억하지 않는다.
예를 들어 사용자가 로그인 요청을 보냈다고 가정해 보자.
1. 로그인 요청
2. 메인 페이지 요청
3. 마이페이지 요청
각 요청은 서로 독립적으로 처리된다.
따라서 별도의 방법이 없다면 서버는 현재 요청을 보낸 사용자가 누구인지 알 수 없다.
이러한 특징을 HTTP의 무상태성(Stateless)이라고 한다.
Session의 역할
Session은 사용자의 상태 정보를 서버에 저장한다.
로그인에 성공하면 Django는 Session을 생성하고 사용자 정보를 저장한다.
login(request, user)
위 코드를 실행하면 Django가 자동으로 Session을 생성한다.
이후 사용자가 다른 페이지를 요청할 때 Session 정보를 확인하여 로그인 상태를 유지할 수 있다.
request.user
덕분에 사용자는 매 요청마다 아이디와 비밀번호를 입력하지 않아도 된다.
User Model 확장
Django는 기본 User 모델을 제공한다.
하지만 실제 서비스를 개발하다 보면 기본 User 모델만으로는 부족한 경우가 많다.
예를 들어 다음과 같은 요구사항이 생길 수 있다.
- 프로필 이미지 추가
- 전화번호 추가
- 닉네임 추가
- 생년월일 추가
- 이메일을 로그인 ID로 사용
이처럼 사용자 정보를 확장해야 하는 경우가 많다.
AbstractUser
Django는 User Model 확장을 위해 AbstractUser를 제공한다.
Custom User를 만들 때는 기본 User 모델을 직접 수정하는 것이 아니라 AbstractUser를 상속받아 새로운 모델을 정의한다.
InconsistentMigrationHistory 에러 발생
이미 프로젝트 전체에 기본 User를 사용하도록 적용되어 있기 때문에 프로젝트 중간에 User 모델을 변경하는 것은 매우 까다롭다.
- 쉬운 해결법: 데이터베이스 삭제하고 처음부터 다시 생성
- db.sqlite3 파일 삭제 후, 다시 mgirate
그렇기에 새로운 Django 프로젝트 생성 시, User 모델 확장이 필요하지 않더라도 미래의 혹시 모를 변경을 위해 CustomUser를 정의하는 것을 권장한다.
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
pass
[참고] 실전! Django 입문 강의