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

By Better Wise · Generated by Everwise

Chọn đúng cách đăng nhập cho sản phẩm, triển khai session hoặc JWT an toàn và biết kiểm tra luồng auth do AI viết.

- **Level:** Beginner
- **Goal:** Build a project
- **Language:** Vietnamese
- **Focus:** [session và cookie](/courses?q=session%20v%C3%A0%20cookie), [JWT và refresh token](/courses?q=JWT%20v%C3%A0%20refresh%20token), [hash mật khẩu](/courses?q=hash%20m%E1%BA%ADt%20kh%E1%BA%A9u), [phân quyền theo vai trò](/courses?q=ph%C3%A2n%20quy%E1%BB%81n%20theo%20vai%20tr%C3%B2)
- **Prior knowledge:** Biết viết API cơ bản, Hiểu HTTP request/response
- **Practice:** Guided exercises
- **Time:** ~3h
- **Voice:** một kỹ sư từng debug lỗ hổng auth trong sản phẩm thật, dạy bằng luồng vẽ tay và luôn hỏi 'token này ai giữ, sống bao lâu, bị lộ thì sao'
- **Not covered:** OAuth nâng cao và OpenID Connect chi tiết, SSO doanh nghiệp, mật mã học

## Bạn sẽ đạt được gì

Sau khóa này, bạn có thể tự tay chọn và lắp một luồng đăng nhập cho sản phẩm thật, thay vì copy một đoạn code auth trên mạng rồi cầu mong nó chạy đúng. Cụ thể:

- Chọn được giữa session + cookie và JWT cho một tình huống cụ thể, và giải thích được vì sao chọn cái đó.
- Đọc hiểu cấu trúc JWT, tự kiểm tra một token trước khi tin nó, và nhận ra các lỗi hay gặp như không kiểm tra chữ ký, đặt `alg` sai, hay nhét dữ liệu nhạy cảm vào payload.
- Hash mật khẩu đúng cách bằng bcrypt hoặc argon2, và biết những lỗi thường gặp khiến hash trở nên vô nghĩa.
- Thiết kế luồng refresh token có rotation và thu hồi, trả lời được câu hỏi: token này ai giữ, sống bao lâu, bị lộ thì sao.
- Viết phân quyền theo vai trò (RBAC) cho API, chặn đúng chỗ thay vì chỉ ẩn nút trên giao diện.
- Tích hợp đăng nhập bằng Google theo OAuth 2.0 ở mức thực dụng, hiểu luồng chuyển hướng và đổi code lấy token.
- Đọc lại code auth do AI viết và kiểm tra bằng một checklist cụ thể, thay vì tin ngay.

## Khóa này dành cho ai

Khóa dành cho người mới bắt đầu với auth nhưng đã có nền lập trình web. Bạn cần:

- Biết viết API cơ bản (một endpoint nhận request, trả response).
- Hiểu HTTP request/response: method, status code, header, cookie.

Không cần biết trước JWT, OAuth hay bcrypt. Mọi khái niệm đều được dựng từ đầu, nhưng phần thực hành giả định bạn đã từng chạm vào code backend.

## Lộ trình khóa học

**Module 1: Nền tảng xác thực: session, cookie và mật khẩu**

- **1.1 Session và cookie: chọn khi nào.** So sánh hai cách giữ trạng thái đăng nhập, khi nào session hợp hơn JWT và ngược lại.
- **1.2 JWT: cấu trúc, cách kiểm tra và các lỗi hay gặp.** Mổ một token ra thành ba phần, xem server phải kiểm tra gì trước khi tin, và các lỗi lặp đi lặp lại.
- **1.3 Hash mật khẩu: bcrypt, argon2 và lỗi thường gặp.** Lưu mật khẩu sao cho khi database bị lộ thì vẫn còn đường lui.
- **1.4 Checkpoint: nền tảng xác thực.** Bài kiểm tra ngắn để chắc bạn nắm phần gốc trước khi đi tiếp.

**Module 2: Refresh token và phân quyền theo vai trò**

- **2.1 Refresh token: luồng cấp mới, rotation và thu hồi.** Cách giữ access token ngắn hạn mà người dùng không phải đăng nhập lại, và cách xử lý khi token bị đánh cắp.
- **2.2 Phân quyền theo vai trò (RBAC) trong API.** Gắn vai trò vào luồng kiểm tra quyền, chặn ở server chứ không chỉ ở giao diện.
- **2.3 Checkpoint: refresh token và phân quyền.** Củng cố phần khó nhất của luồng auth.

**Module 3: Đăng nhập Google, AI viết auth và cách kiểm tra**

- **3.1 Đăng nhập bằng Google: OAuth 2.0 ở mức thực dụng.** Đi qua luồng chuyển hướng, đổi code lấy token và lấy thông tin người dùng.
- **3.2 Khi để AI viết luồng auth: sai lầm và checklist kiểm tra.** Những chỗ AI hay viết thiếu, và bộ câu hỏi để soi lại từng dòng.
- **3.3 Mini project: ghép luồng auth hoàn chỉnh cho sản phẩm.** Nối mọi mảnh đã học thành một luồng chạy được.
- **3.4 Checkpoint: đăng nhập Google và kiểm tra luồng auth.** Bài kiểm tra cuối, tập trung vào việc kiểm tra thay vì viết mới.

## Khóa học vận hành thế nào

Khóa gồm **11 bài, khoảng 180 phút** tổng cộng, chia làm ba module. Mỗi bài thường có ba phần:

- **Lý thuyết ngắn.** Giải thích bằng luồng vẽ tay và ví dụ thật, không lan man.
- **Thực hành có hướng dẫn.** Bạn làm theo từng bước trên luồng auth, mỗi bước đều hỏi lại: token này ai giữ, sống bao lâu, bị lộ thì sao.
- **Checkpoint quiz.** Bài kiểm tra ngắn ở cuối mỗi module để tự đánh giá trước khi đi tiếp.

Cách dùng khóa:

- **Đi tuần tự từ 1.1 đến 3.4** nếu bạn mới với auth. Các bài sau dựa trực tiếp lên bài trước, nhất là phần refresh token và RBAC.
- **Có thể nhảy** nếu bạn đã quen session/JWT. Hãy làm checkpoint 1.4 trước; đúng hết thì vào thẳng Module 2.
- **Đừng bỏ qua 3.2 và 3.3.** Đây là phần biến kiến thức thành kỹ năng kiểm tra, thứ bạn dùng nhiều nhất khi làm việc thật.

## Dự án của khóa: "Luồng auth cho một sản phẩm"

Đây là một sợi chỉ xuyên suốt khóa, không phải các bài tập rời rạc. Bạn xây dần một luồng xác thực hoàn chỉnh cho một sản phẩm giả định, và mỗi bài thêm một mảnh vào đó:

- **Đăng ký và đăng nhập** bằng email/mật khẩu, hash mật khẩu đúng chuẩn (bài 1.3).
- **Chọn cơ chế giữ phiên**: session + cookie hoặc JWT, kèm lý do (bài 1.1, 1.2).
- **Cấp access token và refresh token**, có rotation và thu hồi khi cần (bài 2.1).
- **Gắn vai trò** và chặn quyền ở tầng API (bài 2.2).
- **Thêm nút đăng nhập bằng Google** bên cạnh luồng cũ (bài 3.1).
- **Tự kiểm tra toàn bộ luồng** bằng checklist ở bài 3.2, rồi hoàn thiện ở bài 3.3.

Kết thúc khóa, bạn có một luồng auth chạy được và, quan trọng hơn, một bộ câu hỏi để tự soi lại bất kỳ luồng auth nào bạn gặp sau này.

## Contents

- **🍪 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)
- **♻️ 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)
