Session vs Token Based Authentication
Xin chào các bạn, ngày hôm nay chúng ta sẽ cùng nhau thảo luận về một chủ đề: Session vs Token Based Authentication.
Đây là hai phương thức phổ biến nhất để xác thực người dùng trên các hệ thống ứng dụng web. Mình tin chắc rằng đây là những khái niệm quan trọng mà khi chập chững bước vào nghề, chắc hẳn mọi người đều đã từng nghe qua.
Ok mình cùng bắt đầu thôi.
1. Sơ lược về xác thực (Authentication)
Một cách ngắn gọn thì xác thực là quá trình định danh người dùng (user identity) để trả lời câu hỏi: Ai vừa truy cập, gửi yêu cầu tới hệ thống của tôi? Để làm được việc này user sẽ cung cấp thông tin định danh của mình (user credential) thường qua username/password gửi tới server để xác thực.
2. Session-Based Authentication
Cơ chế hoạt động
Sau khi người dùng đăng nhập thành công, serve sẽ tạo ra một Session ID duy nhất và đồng thời lưu lại Session Id này trong trong DB, bộ nhớ RAM của server, etc. Session ID được lưu trữ trong một cookie và gửi về trình duyệt của client. Sau đó, server sẽ sử dụng Session ID này để xác thực các yêu cầu (request) từ cùng một người dùng trong suốt phiên làm việc.
Quá trình xác thực
- Người dùng gửi thông tin đăng nhập (username và password).
- Máy chủ xác thực và tạo một session ID lưu trữ trong DB. Session ID được lưu trữ trong một cookie và gửi về trình duyệt.
- Mỗi yêu cầu tiếp (request) theo từ người dùng sẽ gửi kèm cookie chứa session ID.
- Máy chủ kiểm tra session ID trong DB để xác thực người dùng. Nếu tìm thấy ID thì trả về tài nguyên cho user.
Ưu điểm
Vì thông tin session được lưu trữ trên DB nên server có toàn quyền kiểm soát session. Một ví dụ cụ thể đó là nếu team security phát hiện một tài khoản bị xâm phạm, họ có thể vô hiệu hóa ID phiên ngay lập tức để người dùng đăng xuất ngay lập tức.
Nhược điểm
Stateful: Máy chủ phải lưu session của người dùng (biến ứng dụng thành stateful application). Do đó không phù hợp cho các hệ thống phân tán hoặc có quy mô lớn, vì cần phải đồng bộ session giữa nhiều máy chủ.
Tài nguyên: Tốn tài nguyên máy chủ để lưu trữ session, đặc biệt nếu số lượng người dùng lớn.
3. Token-Based Authentication (JWT - JSON Web Token)
Cơ chế hoạt động
Sau khi người dùng đăng nhập thành công, máy chủ tạo ra một token định danh người dùng. JWT (Json Web token) là một trong những phương pháp phổ biến được sử dụng. Token được mã hóa, chứa thông tin xác thực (như user ID, quyền truy cập). Sau đó, token này sẽ được gửi về cho client. Token sẽ được lưu trữ ở phía client (thường trong localStorage hoặc session Storage). Tiếp đó, client sẽ được gửi token kèm theo mỗi yêu cầu HTTP trong header (Authorization header) để yêu cầu các quyền truy cập tài nguyên.
Quá trình xác thực
- Người dùng gửi thông tin đăng nhập.
- Máy chủ xác thực thông tin user và tạo một token mã hóa (JWT). Token được gửi về client và lưu trữ tại localStorage hoặc sessionStorage.
- Mỗi yêu cầu tiếp theo sẽ kèm theo token trong phần Authorization header.
- Máy chủ kiểm tra tính hợp lệ của token để xác thực người dùng, trả về tài nguyên người dùng yêu cầu
Ưu điểm
Stateless: Không cần lưu trữ session trên server, phù hợp với các hệ thống phân tán hoặc microservices.
Dễ dàng mở rộng: Vì không cần đồng bộ trạng thái giữa các máy chủ.
Nhược điểm
Bảo mật: Nếu token bị đánh cắp, kẻ tấn công có thể sử dụng token này để truy cập vào hệ thống cho đến khi token hết hạn.
Quản lý token: Hủy token hoặc làm cho nó hết hiệu lực khó hơn vì máy chủ không lưu trữ trạng thái. Thường phải đợi token hết hạn hoặc sử dụng cơ chế blacklist để vô hiệu hóa.
4. Tổng kết
Session vs Token Based Authentication là hai phương thức phổ biến nhất được ứng dụng cho bài toán xác thực (authentication).
Session-Based Authentication phù hợp cho các ứng dụng nhỏ hoặc hệ thống không cần mở rộng quy mô lớn. Trên thực tế, phương thức xác thực bằng session được ứng dụng rất nhiều trong các hệ thống Monolithic.
Token-Based Authentication thường được sử cho các hệ thống phân tán, microservices bởi vì đặc tính stateless không lưu trữ trạng thái token của nó.
Bạn thấy đấy, mỗi phương pháp đều có ưu và nhược điểm riêng. Điều quan trọng là chúng ta làm sao để ứng dụng nó để giải quyết cái bài toán sao cho phù hợp.
Trên đây là bài viết tổng quan về Session vs Token Based Authentication của mình.
Cảm ơn các bạn đã dành thời gian.
Again, mình là Phan
Một chàng developer tò mò và tận tâm.
Hẹn gặp các bạn trong bài viết sắp tới.
All rights reserved