Cả 3 đều là cơ chế giữ "ai đang gọi API", chọn cái nào tuỳ vào kiểu client và tuổi thọ phiên.
Session cookie (mặc định của Django): server giữ state, cookie chỉ giữ session key. Hợp nhất cho browser app cùng domain. Logout server-side dễ (chỉ cần xoá session row), nhưng cần CSRF protection và khó scale cross-domain/mobile. Token (DRF TokenAuthentication): mỗi user 1 token lưu DB, gửi qua Authorization: Token <key>. Hợp với mobile app, internal service đơn giản. Revoke dễ, nhưng không expire mặc định — phải tự code rotation. JWT (vd djangorestframework-simplejwt): self-contained, ký bằng SECRET_KEY hoặc keypair. Hợp với SPA + mobile + microservice vì server không cần tra DB mỗi request. Đổi lại: khó revoke (phải maintain blacklist), payload bị lộ nếu không HTTPS, và SECRET_KEY leak là vỡ trận.
# settings.py — DRF với simplejwt
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
}Một hiểu lầm phổ biến: JWT không phải "advanced version" của session, chỉ là trade-off khác.
- Browser app cùng domain mà chọn JWT lưu localStorage là tự tạo XSS risk; cookie HttpOnly + session vẫn là lựa chọn an toàn nhất.
- Chỉ chọn JWT khi thực sự cần stateless hoặc cross-service.