Trong phát triển ứng dụng web và hệ thống phân tán, việc xác thực người dùng là yếu tố cốt lõi đảm bảo an toàn và quản lý truy cập. Bài học này sẽ giúp bạn hiểu sâu về các cơ chế:
- WWW-Authenticate (Basic Auth)
- Session và Cookie
- JWT (JSON Web Token)
- SSO (Single Sign-On)
- OAuth 2.0
- OAuth 2.0 qua sơ đồ
1.
WWW-Authenticate (Basic Auth)
Giới thiệu:
Đây là một phương thức xác thực đơn giản, được hỗ trợ sẵn trong giao thức HTTP.
Cấu trúc:
- Trình duyệt gửi yêu cầu truy cập.
- Máy chủ trả về mã 401 Unauthorized cùng với header
WWW-Authenticate
. - Trình duyệt hiển thị hộp thoại yêu cầu người dùng nhập tên đăng nhập và mật khẩu.
- Thông tin được mã hóa bằng Base64 và gửi lại trong header
Authorization
.
Cách hoạt động:
- Người dùng mở trình duyệt và truy cập một trang web.
- Máy chủ yêu cầu xác thực qua
WWW-Authenticate
. - Trình duyệt hiển thị form đăng nhập.
- Người dùng nhập thông tin.
- Thông tin được gửi lại để xác minh.
- Nếu đúng, truy cập được cho phép.
Hạn chế:
- Chỉ quản lý được bước đăng nhập.
- Không hỗ trợ quản lý phiên (session) hay danh tính chi tiết.
- Không an toàn nếu không dùng HTTPS.
2.
Session và Cookies
Giới thiệu:
Cơ chế xác thực phổ biến trong các ứng dụng truyền thống, đặc biệt là các hệ thống dùng server-side rendering.
Cấu trúc:
- Sau khi đăng nhập thành công, máy chủ tạo một session trên server.
- Gửi session ID qua cookie cho trình duyệt.
- Trình duyệt lưu cookie và gửi lại trong các yêu cầu tiếp theo.
Cách hoạt động:
- Người dùng đăng nhập.
- Máy chủ tạo session, lưu trạng thái trên server.
- Gửi cookie chứa
session_id
cho trình duyệt. - Trình duyệt tự động gửi cookie trong các lần truy cập sau.
- Server xác định người dùng thông qua
session_id
.
Vấn đề:
- Không hỗ trợ tốt cho ứng dụng di động.
- Không tiện khi triển khai hệ thống phân tán không trạng thái (stateless).
3.
JWT (JSON Web Token)
Giới thiệu:
JWT là một chuẩn xác thực dạng token hiện đại, thường dùng trong API và ứng dụng không trạng thái.
Cấu trúc Token:
Header.Payload.Signature
- Header: Chứa thuật toán ký và loại token.
- Payload: Dữ liệu người dùng (claims).
- Signature: Bảo vệ tính toàn vẹn của token.
Cách hoạt động:
- Người dùng đăng nhập thành công.
- Server tạo JWT và gửi về cho trình duyệt (qua cookie hoặc localStorage).
- Trình duyệt lưu token.
- Gửi token trong header
Authorization: Bearer <token>
ở các lần gọi sau. - Server xác minh token để xác thực người dùng.
Ưu điểm:
- Giảm chi phí xác thực do không cần lưu session.
- Hỗ trợ tốt API, mobile app, login đa nền tảng.
- Thích hợp cho mô hình không trạng thái (stateless).
4.
SSO (Single Sign-On)
Giới thiệu:
SSO cho phép người dùng đăng nhập một lần và được truy cập vào nhiều hệ thống liên kết mà không cần đăng nhập lại.
Cấu trúc và giao thức:
- Dựa trên các giao thức như CAS, SAML, OAuth, OpenID Connect.
Quy trình:
- Người dùng truy cập hệ thống A (a.com).
- Hệ thống A chuyển hướng tới dịch vụ xác thực trung tâm (SSO, ví dụ sso.com).
- Người dùng đăng nhập tại sso.com.
- SSO xác thực và trả về token truy cập.
- Người dùng được cấp quyền vào A, và có thể truy cập B (b.com) mà không cần đăng nhập lại.
Lợi ích:
- Trải nghiệm người dùng liền mạch.
- Quản lý xác thực tập trung.
- Tăng tính bảo mật.
5.
OAuth 2.0
Giới thiệu:
Là giao thức ủy quyền (authorization) cho phép ứng dụng bên thứ ba truy cập tài nguyên thay mặt người dùng một cách an toàn.
Các Grant Types:
- Authorization Code: Cho ứng dụng server-side (bảo mật cao).
- Implicit Grant: Dùng cho ứng dụng client-side (mobile, SPA).
- Password Grant: Người dùng nhập trực tiếp tài khoản (ít dùng).
- Client Credentials: Hệ thống-to-hệ thống, không có người dùng.
Quy trình hoạt động:
- Ứng dụng yêu cầu quyền từ người dùng.
- Người dùng đồng ý và được chuyển hướng tới máy chủ xác thực.
- Máy chủ xác thực cấp access token.
- Ứng dụng dùng token để gọi API và truy cập tài nguyên.
Bảo mật:
- Dùng HTTPS bắt buộc.
- Token có thời hạn.
- Có thể dùng thêm refresh token để kéo dài phiên đăng nhập.
6.
OAuth 2.0 qua sơ đồ minh hoạ
Hỗ trợ các loại luồng:
Authorization Code: qua trình duyệt (web app).
Client Credentials: giữa các server (machine to machine).
Implicit Grant: cho app di động, app SPA.
Password Grant: khi người dùng tin tưởng ứng dụng (ít khuyến khích).
Sơ đồ tổng quát (tưởng tượng):
[User] --login--> [App] --redirect--> [Auth Server] --approve--> [App]
|
access_token
|
[Resource Server]
Tóm lại:
Phương thức | Trạng thái | Bảo mật | Phù hợp cho |
---|---|---|---|
Basic Auth | Không trạng thái | Thấp | API đơn giản |
Session+Cookie | Có trạng thái | Vừa | Web truyền thống |
JWT | Không trạng thái | Cao | API, SPA, Mobile |
SSO | Trung tâm xác thực | Cao | Doanh nghiệp, đa miền |
OAuth 2.0 | Linh hoạt | Rất cao | Ứng dụng bên thứ ba, API |