DEV Community

Do Van Phuc
Do Van Phuc

Posted on

Các kiểu HTTP Authentication

HTTP Authentication là một cơ chế xác thực người dùng trực tiếp trong giao thức HTTP để kiểm soát quyền truy cập vào tài nguyên trên web. Nó được sử dụng khi client (trình duyệt, ứng dụng) cần chứng minh danh tính với server trước khi truy cập dữ liệu hoặc API.

Các loại HTTP Authentication phổ biến

Basic Authentication

Basic Authentication là một phương thức xác thực đơn giản sử dụng username và password để xác minh người dùng. Nó là một phần của chuẩn HTTP và thường được sử dụng trong các API đơn giản hoặc các hệ thống không yêu cầu bảo mật quá cao.

Cách hoạt động

Client gửi yêu cầu:
Khi truy cập một API hoặc tài nguyên được bảo vệ, client phải gửi yêu cầu có chứa thông tin xác thực.
Mã hóa thông tin xác thực:
Username và password được ghép lại theo định dạng username:password.
Sau đó, chuỗi này được mã hóa bằng Base64.
Ví dụ:
username:password -> dXNlcm5hbWU6cGFzc3dvcmQ=

Gửi trong header HTTP:
Client gửi chuỗi mã hóa này trong header của request:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Server kiểm tra và phản hồi:

  • Server giải mã Base64, kiểm tra username và password.
  • Nếu đúng, server trả về status 200 OK cùng với dữ liệu yêu cầu.
  • Nếu sai, server trả về status 401 Unauthorized.

Ưu, nhược điểm của Basic authentication
Basic Authentication có ưu điểm là đơn giản, dễ triển khai và không cần can thiệp vào mã nguồn backend.
Tuy nhiên, nó có nhược điểm về bảo mật, thiếu tính linh hoạt và không phù hợp cho các ứng dụng phức tạp hoặc mobile.
Vì vậy, cần cân nhắc sử dụng phương pháp xác thực khác như JWT hoặc OAuth cho các ứng dụng yêu cầu bảo mật cao hơn và tính năng phức tạp hơn.

JWT (JSON Web Token)

JWT là một tiêu chuẩn mở (RFC 7519) dùng để truyền thông tin an toàn giữa các bên dưới dạng JSON. Nó thường được sử dụng để xác thực người dùng và cấp quyền truy cập trong API hoặc ứng dụng web.

Cấu trúc của JWT

JWT có ba phần chính, được phân tách bởi dấu chấm (.):

Header: Chứa loại token và thuật toán mã hóa (thường là HMAC hoặc RSA).

{
  "alg": "HS256",
  "typ": "JWT"
}
Enter fullscreen mode Exit fullscreen mode

Payload: Chứa thông tin của user và các claims (quyền hạn, thời gian hết hạn,...).
Claims là tập hợp các thông tin đại diện cho một thực thể (object) (ví dụ user_id) và một số thông tin đi kèm. Claims sẽ có dạng Key - Value. Do đó, chúng ta có thể hiểu rằng, claims ám chỉ việc yêu cầu truy xuất tài nguyên cho object tương ứng.

Có ba loại claim chính:

  • Registered claims: Là các claim được định nghĩa sẵn bởi chuẩn JWT, bao gồm "iss" (Issuer), "sub" (Subject), "exp" (Expiration Time), "nbf" (Not Before), "iat" (Issued At) và "jti" (JWT ID).
  • Public claims: Là các claim mà có thể được sử dụng không xung đột với các standard claim, nhưng cần thống nhất với các entities sử dụng JWT.
  • Private claims: Là các claim mà được sử dụng để chuyển thông tin giữa các bên, nhưng không được định nghĩa trong chuẩn JWT.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": 1710000000
}
Enter fullscreen mode Exit fullscreen mode

Signature: Được tạo ra bằng cách mã hóa base64 của header và payload sử dụng thuật toán đã được chỉ định trong header bằng cách sử dụng một secret key. Signature này dùng để xác minh tính hợp lệ của token.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)
Enter fullscreen mode Exit fullscreen mode

Khi kết hợp, các phần header, payload và signature tạo thành một chuỗi token có dạng "{base64url-encoded header}.{base64url-encoded payload}.{signature}".

Ví dụ về JWT hoàn chỉnh:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNzEwMDAwMDAwfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Enter fullscreen mode Exit fullscreen mode

Cách hoạt động của JWT

  • Client gửi yêu cầu đăng nhập với username & password.
  • Server kiểm tra thông tin: Nếu đúng, server tạo một JWT chứa thông tin người dùng. Trả lại JWT cho client.
  • Client gửi JWT trong các request tiếp theo: JWT được gửi trong header HTTP: Authorization: Bearer <JWT>
  • Server kiểm tra JWT: Nếu hợp lệ, server xác nhận người dùng và xử lý request. Nếu không hợp lệ hoặc hết hạn, trả về status 401 Unauthorized.

Ưu, nhược điểm của JWT

Ưu điểm của JWT

  • Không cần lưu trữ trạng thái trên server (stateless).
  • Nhanh và hiệu quả: Vì token chứa toàn bộ thông tin, server không cần truy vấn database mỗi lần xác thực.
  • Có thể chứa nhiều thông tin như quyền hạn, thời gian hết hạn.

Nhược điểm của JWT

  • Không thể thu hồi: Nếu JWT bị rò rỉ, kẻ tấn công có thể sử dụng nó đến khi hết hạn.
  • Kích thước lớn hơn Basic Auth do chứa nhiều thông tin.
  • Cần bảo mật khóa bí mật: Nếu bị lộ, JWT có thể bị giả mạo.

Kết luận

HTTP Authentication là một cơ chế quan trọng để bảo vệ tài nguyên trên web và kiểm soát quyền truy cập của người dùng. Hai phương thức phổ biến là Basic Authentication và JWT (JSON Web Token), mỗi phương thức đều có ưu điểm và nhược điểm riêng. Bên cạnh Basic Authentication và JWT, còn có nhiều phương thức xác thực phổ biến khác như OAuth, Digest Authentication,...

Top comments (0)