🔐 Cheatsheet: Xác thực và phân quyền: session, JWT và OAuth

By Better Wise

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