# ✅ Checkpoint: nền tảng xác thực

By Better Wise



## Quiz

1. Với một web app có trang đăng nhập, trình duyệt là client chính và cần đăng xuất tức thì khi đổi mật khẩu, cách giữ trạng thái đăng nhập nào phù hợp nhất?
   - Session-based: server giữ session trong store, client chỉ giữ session ID trong cookie HttpOnly
   - Không cần cơ chế nào, chỉ cần kiểm tra mật khẩu ở mỗi request
   - JWT access token gắn vào query string của mọi request
   - JWT access token sống 7 ngày lưu trong localStorage
2. Một đồng nghiệp cấu hình cookie phiên với `sameSite: "none"` nhưng không có `secure` và không có `httpOnly`. Hai hệ quả đúng là gì?
   - Thiếu Secure chỉ ảnh hưởng tốc độ tải trang, thiếu HttpOnly chỉ ảnh hưởng SEO
   - Cookie sẽ tự động được mã hóa nên không có rủi ro nào
   - Cookie vẫn hoạt động bình thường, chỉ chậm hơn một chút
   - Trình duyệt hiện đại từ chối lưu cookie vì SameSite=None thiếu Secure, và XSS có thể đọc được session ID vì thiếu HttpOnly
3. Đoạn code sau dùng để chặn người dùng thường gọi API admin. Lỗi nghiêm trọng nhất là gì?

```js
const payload = jwt.decode(token)
if (payload.role === 'admin') return grantAdmin()
```
   - Phải dùng jwt.verify() nhưng vẫn giữ nguyên logic đọc role từ payload là đủ an toàn
   - Dùng jwt.decode() nên không kiểm tra chữ ký; ai cũng tự tạo token với role admin và được cấp quyền
   - Không có lỗi, decode đã kiểm tra chữ ký giúp
   - Thiếu kiểm tra exp nên token hết hạn vẫn dùng được, đó là lỗi duy nhất
4. Vì sao không nên lưu mật khẩu bằng SHA-256 trần (dù có tự thêm salt thủ công)?
   - SHA-256 không hỗ trợ ký tự Unicode trong mật khẩu
   - SHA-256 bị lỗi thời vì không còn ai dùng trong bất kỳ hệ thống nào
   - SHA-256 được thiết kế để chạy nhanh, GPU có thể thử hàng tỷ lần mỗi giây nên dễ bị dò offline
   - SHA-256 cho ra chuỗi quá dài để lưu vào database
5. Trên máy bạn, bcrypt cost 10 mất khoảng 60ms. Cost 12 mất bao lâu và nên chọn thế nào cho API đăng nhập?
   - Khoảng 60ms; cost không ảnh hưởng thời gian hash
   - Khoảng 960ms; nên chọn cost 14 cho mọi API để an toàn nhất
   - Khoảng 240ms; cost 12 là lựa chọn hợp lý vì mỗi bậc cost làm thời gian gấp đôi
   - Khoảng 120ms; cost 12 là mức tối thiểu bắt buộc
6. Khi verify mật khẩu với hash đã lưu, cách nào đúng và an toàn?
   - Dùng md5(plain) rồi so sánh với cột password
   - Hash lại mật khẩu rồi so sánh chuỗi bằng ===
   - Dùng bcrypt.compare(plain, stored) hoặc argon2.verify(stored, plain)
   - So sánh trực tiếp user.password === req.body.password
7. Thuộc tính cookie ____ ngăn JavaScript đọc được cookie, nhờ đó một lỗ XSS khó lấy được session ID.
8. Trong JWT, claim ____ là thời điểm token hết hạn, tính bằng giây kể từ epoch.
9. bcrypt chỉ dùng ____ byte đầu tiên của mật khẩu; phần dư bị bỏ qua âm thầm.
10. Hãy tự đánh giá: bạn có thể chọn cách giữ trạng thái đăng nhập cho một project cụ thể và giải thích lý do, đồng thời chỉ ra cách lưu mật khẩu an toàn không?


---

## Contents

Part of [🔐 Xác thực và phân quyền: session, JWT và OAuth](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth.md)

- **🍪 Nền tảng xác thực: session, cookie và mật khẩu**
  - [🍪 Session và cookie: chọn khi nào](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/session-va-cookie-chon-khi-nao.md)
  - [🎫 JWT: cấu trúc, cách kiểm tra và các lỗi hay gặp](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/jwt-cau-truc-cach-kiem-tra-va-loi-hay-gap.md) (sign-in required)
  - [🔑 Hash mật khẩu: bcrypt, argon2 và lỗi thường gặp](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/hash-mat-khau-bcrypt-argon2-va-loi-thuong-gap.md)
  - [✅ Checkpoint: nền tảng xác thực](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/checkpoint-nen-tang-xac-thuc.md) — this lesson
- **♻️ Refresh token và phân quyền theo vai trò**
  - [🔄 Refresh token: luồng cấp mới, rotation và thu hồi](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/refresh-token-luong-cap-moi-rotation-va-thu-hoi.md)
  - [🛡️ Phân quyền theo vai trò (RBAC) trong API](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/phan-quyen-theo-vai-tro-rbac-trong-api.md)
  - [✅ Checkpoint: refresh token và phân quyền](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/checkpoint-refresh-token-va-phan-quyen.md)
- **🌐 Đăng nhập Google, AI viết auth và cách kiểm tra**
  - [🔵 Đăng nhập bằng Google: OAuth 2.0 ở mức thực dụng](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/dang-nhap-bang-google-oauth-2-thuc-dung.md)
  - [🤖 Khi để AI viết luồng auth: sai lầm và checklist kiểm tra](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/ai-viet-luong-auth-sai-lam-va-checklist-kiem-tra.md)
  - [🧩 Mini project: ghép luồng auth hoàn chỉnh cho sản phẩm](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/mini-project-ghep-luong-auth-hoan-chinh.md) (premium content)
  - [✅ Checkpoint: đăng nhập Google và kiểm tra luồng auth](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/checkpoint-dang-nhap-google-va-kiem-tra-luong-auth.md) (premium content)
- [Course cheatsheet](https://everwise.study/courses/xac-thuc-va-phan-quyen-session-jwt-va-oauth/cheatsheet.md) (premium content)
