1. Authentication & Authorization là gì?

Authentication và Authorization là hai khái niệm quan trọng trong bảo mật hệ thống, đặc biệt khi phát triển Website, Mobile App và REST API. Cả hai đều giúp kiểm soát việc truy cập vào hệ thống nhưng đảm nhiệm hai chức năng khác nhau.

Authentication là quá trình xác minh danh tính của người dùng hoặc hệ thống đang gửi yêu cầu. Mục đích là xác định đối tượng truy cập có đúng với danh tính mà họ cung cấp hay không.

Ví dụ: Khi người dùng đăng nhập vào một ứng dụng bằng email và mật khẩu, hệ thống sẽ kiểm tra thông tin đăng nhập. Nếu thông tin hợp lệ, hệ thống xác nhận người dùng và cho phép họ tiếp tục sử dụng các chức năng cần đăng nhập.

Authorization là quá trình kiểm tra người dùng đã được xác thực có quyền thực hiện một hành động hoặc truy cập một tài nguyên cụ thể hay không.

Ví dụ: Trong một website quản lý nhân viên, nhân viên có thể xem thông tin cá nhân của mình nhưng không được phép xóa tài khoản của người khác. Trong khi đó, quản trị viên có thể được cấp quyền quản lý tài khoản theo quy định của hệ thống.

Nói đơn giản:

  • Authentication: Bạn là ai?
  • Authorization: Bạn được phép làm gì?Authentication vs Authorization: What is the Difference?

2. Authentication – Xác thực

2.1. Authentication hoạt động như thế nào?

Authentication thường được thực hiện khi người dùng đăng nhập hoặc khi hệ thống cần xác minh danh tính trước khi cho phép truy cập vào các tài nguyên được bảo vệ.

Quy trình cơ bản gồm các bước:

Bước 1: Người dùng cung cấp thông tin xác thực

Người dùng nhập email, mật khẩu hoặc sử dụng phương thức xác thực khác như mã OTP, sinh trắc học hay tài khoản của một nhà cung cấp đăng nhập bên ngoài.

Bước 2: Backend kiểm tra thông tin

Hệ thống kiểm tra thông tin được cung cấp dựa trên dữ liệu xác thực đã lưu hoặc thông qua dịch vụ xác thực phù hợp.

Bước 3: Xác định kết quả xác thực

Nếu thông tin hợp lệ, hệ thống xác nhận danh tính người dùng. Nếu thông tin không hợp lệ, hệ thống từ chối đăng nhập và trả về thông báo phù hợp.

Bước 4: Thiết lập trạng thái đăng nhập

Sau khi xác thực thành công, hệ thống có thể tạo Session hoặc cấp Token để nhận diện người dùng trong những Request tiếp theo.

2.2. Các phương thức Authentication phổ biến

  • Username & Password: Người dùng đăng nhập bằng tên tài khoản hoặc email cùng mật khẩu.
  • OTP (One-Time Password): Sử dụng mã xác thực dùng một lần, thường được gửi qua SMS, email hoặc ứng dụng xác thực.
  • Multi-Factor Authentication : Kết hợp nhiều yếu tố xác thực để tăng mức độ bảo mật, chẳng hạn mật khẩu và mã xác thực từ ứng dụng.
  • Biometric Authentication: Xác thực bằng đặc điểm sinh trắc học như vân tay hoặc khuôn mặt, tùy thiết bị và hệ thống hỗ trợ.
  • OAuth 2.0 và OpenID Connect: Các tiêu chuẩn được sử dụng trong hệ thống đăng nhập và cấp quyền truy cập. OpenID Connect bổ sung khả năng xác thực danh tính trên nền OAuth 2.0.

2.3. Session và Token

Sau khi đăng nhập thành công, hệ thống cần có cơ chế nhận biết người dùng trong các Request tiếp theo. Hai phương thức thường gặp là Session-Based Authentication và Token-Based Authentication.

Session-Based Authentication là phương thức trong đó Server lưu trạng thái đăng nhập của người dùng. Client giữ Session ID và gửi lại trong những Request tiếp theo để Server xác định phiên đăng nhập tương ứng.

Token-Based Authentication sử dụng Token để chứng minh hoặc truyền tải thông tin xác thực theo cơ chế của hệ thống. Client gửi Token trong các Request cần xác thực, thường thông qua HTTP Authorization Header.

JWT là một định dạng Token phổ biến, có thể chứa các thông tin như định danh người dùng và thời hạn hiệu lực. Hệ thống cần kiểm tra chữ ký, thời hạn và các điều kiện cần thiết khi sử dụng JWT. Token cũng phải được bảo vệ để tránh bị đánh cắp hoặc sử dụng trái phép.

3. Authorization – Phân quyền

3.1. Authorization hoạt động như thế nào?

Sau khi xác thực danh tính, hệ thống cần kiểm tra quyền hạn của người dùng trước khi cho phép họ thực hiện các hành động được bảo vệ.

Quy trình cơ bản gồm:

Bước 1: Người dùng gửi Request

Người dùng yêu cầu thực hiện một chức năng như xem hồ sơ, chỉnh sửa thông tin hoặc xóa dữ liệu.

Bước 2: Backend xác định danh tính và quyền hạn

Hệ thống xác minh thông tin xác thực, sau đó kiểm tra vai trò, quyền được cấp và các điều kiện truy cập liên quan.

Bước 3: Quyết định cho phép hoặc từ chối

Nếu người dùng đáp ứng các điều kiện cần thiết, hệ thống cho phép thực hiện hành động. Nếu không đủ quyền, hệ thống từ chối Request.

Bước 4: Trả về kết quả

API trả về dữ liệu hoặc thông báo phù hợp tùy theo kết quả kiểm tra quyền truy cập.

3.2. Các mô hình Authorization phổ biến

Role-Based Access Control (RBAC)

RBAC là mô hình phân quyền dựa trên vai trò. Mỗi người dùng được gán một hoặc nhiều vai trò, và mỗi vai trò có các quyền tương ứng.

Ví dụ:

  • Admin: Quản lý người dùng, cấu hình và các chức năng quản trị.
  • Manager: Quản lý nhóm hoặc công việc trong phạm vi được cấp quyền.
  • User: Sử dụng các chức năng thông thường của ứng dụng.

Attribute-Based Access Control

ABAC quyết định quyền truy cập dựa trên các thuộc tính của người dùng, tài nguyên, hành động và bối cảnh của Request.

Ví dụ: Nhân viên chỉ được xem tài liệu thuộc phòng ban của mình và đáp ứng các điều kiện truy cập do hệ thống quy định.

Permission-Based Access Control

Mô hình này tập trung vào các quyền cụ thể được cấp cho người dùng hoặc vai trò, chẳng hạn quyền xem, tạo, sửa hoặc xóa dữ liệu.

Trong thực tế, một hệ thống có thể kết hợp nhiều mô hình phân quyền để đáp ứng yêu cầu nghiệp vụ.

4. Authentication & Authorization trong REST API

Trong ứng dụng sử dụng REST API, Frontend gửi Request đến Backend để lấy dữ liệu hoặc thực hiện các thao tác. Backend chịu trách nhiệm xác thực danh tính và kiểm tra quyền truy cập trước khi xử lý những Request cần được bảo vệ.

Ví dụ, trong một website quản lý người dùng:

  • Khi người dùng đăng nhập, API thực hiện Authentication để xác minh danh tính.
  • Khi người dùng yêu cầu xem hồ sơ cá nhân, API kiểm tra thông tin xác thực và quyền truy cập.
  • Khi người dùng muốn xóa tài khoản của người khác, API kiểm tra xem họ có quyền thực hiện thao tác đó hay không.
  • Nếu người dùng chưa đăng nhập hoặc thông tin xác thực không hợp lệ, API thường trả về 401 Unauthorized.
  • Nếu người dùng đã được xác thực nhưng không có quyền thực hiện hành động, API thường trả về 403 Forbidden.

Điểm quan trọng là việc ẩn nút chức năng trên Frontend không đủ để bảo vệ dữ liệu. Backend vẫn phải tự kiểm tra quyền trên mỗi Request phù hợp, vì người dùng có thể gửi Request trực tiếp mà không thông qua giao diện ứng dụng.

5. Sự khác nhau giữa Authentication và Authorization

Authentication tập trung vào việc xác minh danh tính. Authorization tập trung vào việc xác định phạm vi quyền hạn của danh tính đó.

Ví dụ: Một người đăng nhập thành công vào hệ thống quản lý có nghĩa là danh tính của họ đã được xác thực. Tuy nhiên, điều đó không đồng nghĩa họ có thể xem mọi dữ liệu hoặc sử dụng tất cả chức năng quản trị.

Hai cơ chế này thường hoạt động cùng nhau nhưng không thể thay thế cho nhau. Một hệ thống có thể xác thực người dùng chính xác nhưng vẫn không an toàn nếu không kiểm tra quyền truy cập vào dữ liệu và chức năng.Tất tần tật về Authentication và Authorization trong phát triển phần mềm

6. Các HTTP Status Code liên quan

Một số mã trạng thái HTTP thường được sử dụng khi xử lý Authentication và Authorization:

  • 200 OK: Request được xử lý thành công.
  • 201 Created: Tạo tài nguyên thành công.
  • 400 Bad Request: Request không hợp lệ.
  • 401 Unauthorized: Chưa xác thực hoặc thông tin xác thực không hợp lệ.
  • 403 Forbidden: Đã xác thực nhưng không có quyền truy cập theo chính sách của hệ thống.
  • 404 Not Found: Không tìm thấy tài nguyên. Một số hệ thống cũng có thể sử dụng mã này để tránh tiết lộ sự tồn tại của tài nguyên mà người dùng không được phép truy cập.

Việc lựa chọn Status Code cần phù hợp với ngữ nghĩa HTTP và được sử dụng nhất quán trong API.

7. Những nguyên tắc bảo mật cần lưu ý

7.1. Bảo vệ thông tin đăng nhập

Mật khẩu không nên được lưu dưới dạng văn bản thuần. Hệ thống cần sử dụng thuật toán băm mật khẩu chuyên dụng như Argon2id hoặc bcrypt cùng cấu hình phù hợp.

7.2. Bảo vệ Token và Session

Token và Session ID cần được bảo vệ để tránh bị đánh cắp. Tùy kiến trúc ứng dụng, hệ thống cần cấu hình thời hạn sử dụng, cơ chế hết hạn hoặc thu hồi và phương thức lưu trữ an toàn.

7.3. Luôn kiểm tra quyền tại Backend

Mọi thao tác cần được bảo vệ phải được kiểm tra quyền ở phía Server. Không nên chỉ dựa vào việc ẩn hoặc hiện các chức năng trên giao diện Frontend.

7.4. Áp dụng nguyên tắc quyền tối thiểu

Principle of Least Privilege là nguyên tắc chỉ cấp cho người dùng những quyền cần thiết để thực hiện công việc của họ. Điều này giúp hạn chế thiệt hại nếu tài khoản bị xâm phạm hoặc người dùng vô tình thực hiện thao tác không phù hợp.

7.5. Sử dụng HTTPS

HTTPS giúp mã hóa dữ liệu truyền giữa Client và Server, giảm nguy cơ thông tin đăng nhập hoặc Token bị đọc trộm trong quá trình truyền tải. Tuy nhiên, HTTPS không thay thế việc kiểm tra danh tính và quyền truy cập.

8. Mối quan hệ với các khái niệm khác

  • API Validation: Kiểm tra dữ liệu đầu vào có hợp lệ hay không.
  • API Error Handling: Xử lý lỗi và trả về phản hồi phù hợp khi xác thực hoặc phân quyền thất bại.
  • REST API: Cung cấp giao diện để Client giao tiếp với Backend.
  • JWT: Định dạng Token thường dùng để truyền tải thông tin xác thực.
  • Session Management: Quản lý trạng thái đăng nhập của người dùng.
  • RBAC: Phân quyền dựa trên vai trò.
  • MFA: Tăng cường xác thực bằng nhiều yếu tố.
  • HTTPS: Bảo vệ dữ liệu trong quá trình truyền tải.

9. Tóm lại

Authentication và Authorization là hai thành phần nền tảng trong bảo mật ứng dụng. Authentication giúp xác minh người dùng là ai, còn Authorization xác định người dùng được phép thực hiện những hành động nào.

Khi phát triển Backend hoặc REST API, cần kết hợp cả hai cơ chế, kiểm tra quyền tại Server, bảo vệ mật khẩu và Token, sử dụng HTTPS và áp dụng nguyên tắc cấp quyền tối thiểu. Triển khai đúng cách giúp bảo vệ dữ liệu, hạn chế truy cập trái phép và tăng độ an toàn cho toàn bộ hệ thống.

Các từ khóa cần ghi nhớ: Authentication, Authorization, Xác thực, Phân quyền, Session, Token, JWT, OAuth 2.0, OpenID Connect, MFA, RBAC, ABAC, HTTP Status Code, 401 Unauthorized, 403 Forbidden, HTTPS, Principle of Least Privilege.

Bài viết khác

API Error Handling 

1. API Error Handling là gì? API Error Handling là quá trình xử lý các lỗi có thể xảy ra trong quá trình API tiếp nhận Request, thực hiện xử lý dữ liệu và trả về Response cho Client. Mục đích là giúp hệ thống nhận biết lỗi, xử lý lỗi một cách phù hợp […]

API Validation

1. API Validation là gì? API Validation là quá trình kiểm tra tính hợp lệ của dữ liệu khi Client gửi Request đến API. Mục đích là đảm bảo dữ liệu đáp ứng các điều kiện mà hệ thống yêu cầu trước khi được xử lý hoặc lưu vào Database. Ví dụ khi người dùng […]

Test Scenario(Kịch bản kiểm thử)

1. Lời mở đầu và vị trí chiến lược của Test Scenario trong quy trình kiểm thử: Trong bức tranh tổng thể của vòng đời kiểm thử phần mềm (STLC), sau khi đã hoàn thành việc phân tích yêu cầu và lập kế hoạch kiểm thử (Test Plan), công việc tiếp theo mang tính chất […]

Dart OOP

OOP là từ viết tắt của cụm từ Object Oriented Programming. Nó có nghĩa là lập trình hướng đối tượng. Đây là một phương pháp lập trình dựa trên những khái niệm về đối tượng và lớp. OOP thường tập trung vào những đối tượng thao tác hơn là tập trung vào logic để có […]

Dart Fundamentals

Dart là gì? Dart là một ngôn ngữ lập trình hướng đối tượng, mã nguồn mở, được phát triển bởi Google vào năm 2011. Ngôn ngữ này được tối ưu hóa đặc biệt cho việc phát triển giao diện người dùng (UI) mượt mà trên nhiều nền tảng (Mobile, Web, Desktop). Dart thường được gắn […]

SOLID & Design Pattern

SOLID là một tập hợp của năm nguyên tắc lập trình quan trọng, được Robert C. Martin, còn được biết đến với tên Uncle Bob, đề xuất. Những nguyên tắc này được thiết kế để giúp ngăn chặn việc phát sinh các vấn đề phổ biến trong lập trình, giúp code dễ bảo dưỡng, mở […]

Leave a Reply

Your email address will not be published. Required fields are marked *