Cheatsheet: Xác thực và phân quyền: session, JWT và OAuth
Note: Câu hỏi xuyên suốt: token/session này ai giữ, sống bao lâu, bị lộ thì sao?
1. Bảng quyết định nhanh: chọn cách đăng nhập
| Tình huống | Chọn | Lý do |
|---|---|---|
| Web app render server (Next.js SSR, Rails, Django) | Session + cookie | Server thu hồi được ngay, không cần lưu token ở client |
| SPA + API riêng, cùng domain | Session + cookie hoặc JWT ngắn hạn | Cookie HttpOnly an toàn hơn localStorage |
| Mobile app / third-party client | JWT access + refresh token | Không có cookie jar ổn định, cần stateless |
| Cần logout tức thì mọi thiết bị | Session store hoặc refresh token có revoke | JWT thuần không thu hồi được |
| Microservices, nhiều service tin nhau | JWT access token ngắn hạn | Verify bằng public key, không gọi DB mỗi request |
| Chỉ cần "đăng nhập bằng Google" | OAuth 2.0 + Authorization Code + PKCE | Không tự quản mật khẩu |
Quy tắc: access token càng ngắn hạn càng tốt (5-15 phút). Refresh token dài hạn nhưng phải rotation + revoke.
2. Module 1.1: Session và cookie
Session hoạt động thế nào
sequenceDiagram
participant B as Browser
participant S as Server
participant D as Session Store
B->>S: POST /login (email, password)
S->>D: Tạo session_id, lưu userId
S-->>B: Set-Cookie: sid=...; HttpOnly; Secure; SameSite
B->>S: GET /me (Cookie: sid=...)
S->>D: Tra session_id
D-->>S: userId
S-->>B: 200 dữ liệu user
Thuộc tính cookie quan trọng
| Thuộc tính | Giá trị nên dùng | Ý nghĩa |
|---|---|---|
HttpOnly |
luôn bật | JS không đọc được, chặn đánh cắp qua XSS |
Secure |
luôn bật ở production | Chỉ gửi qua HTTPS |
SameSite |
Lax (mặc định) hoặc Strict |
Chặn CSRF cơ bản |
SameSite=None |
chỉ khi cross-site thật | Bắt buộc kèm Secure |
Path |
/ |
Phạm vi gửi cookie |
Max-Age / Expires |
theo TTL session | Cookie hết hạn cùng session |
Checklist session
This cheatsheet is premium content. Sign in and purchase the course to view the full content. Sign in