0
0
Lập trình
NM

Hiểu rõ về Luồng Access Token và Refresh Token

Đăng vào 8 tháng trước

• 5 phút đọc

Chủ đề:

KungFuTech

Hiểu rõ về Luồng Access Token và Refresh Token

Bảo mật API của ứng dụng là điều cực kỳ quan trọng, và việc sử dụng hệ thống xác thực dựa trên token là chìa khóa để đảm bảo điều này. Vậy luồng Access Token và Refresh Token hoạt động như thế nào, đặc biệt là khi giữ cho người dùng đăng nhập mà không làm giảm bảo mật? 🤔

1. Đăng nhập ban đầu

Khi một người dùng đăng nhập, máy chủ sẽ xác thực thông tin đăng nhập của họ. Nếu thông tin chính xác, máy chủ sẽ phát hành hai loại token:

  • Access Token: Đây là một token có thời hạn ngắn (từ vài phút đến một giờ). Đây là token mà frontend sẽ gửi kèm mỗi yêu cầu API để chứng minh danh tính của người dùng.

  • Refresh Token: Đây là token có thời hạn dài hơn (từ vài ngày đến vài tuần). Token này không được sử dụng cho các cuộc gọi API. Mục đích duy nhất của nó là lấy một access token mới khi token hiện tại hết hạn.

2. Thực hiện các cuộc gọi API

Đối với mọi tài nguyên được bảo vệ, frontend sẽ gửi access token trong tiêu đề Authorization. Backend sẽ nhanh chóng xác thực token này, và nếu nó hợp lệ, yêu cầu sẽ được xử lý.

3. Hết hạn token

Điều kỳ diệu xảy ra khi access token hết hạn. Thay vì yêu cầu người dùng đăng nhập lại, client API của frontend (thường là một interceptor) sẽ phát hiện lỗi "401 Unauthorized". Thay vì thông báo cho client về lỗi 401, nó sẽ bắt đầu luồng refresh token.

4. Luồng Refresh

Client sẽ sử dụng refresh token để gọi một endpoint dành riêng cho /refresh trên backend. Nếu refresh token hợp lệ và chưa bị thu hồi hoặc hết hạn, backend sẽ phát hành một cặp token mới - một access token mới và một refresh token mới. Refresh token cũ sẽ bị vô hiệu hóa, đây là một bước quan trọng cho bảo mật.

5. Trải nghiệm người dùng mượt mà

Frontend sẽ cập nhật các token đã lưu và thử lại yêu cầu API ban đầu với access token mới. Tất cả những điều này diễn ra một cách liền mạch trong nền, cung cấp trải nghiệm người dùng mượt mà và không bị gián đoạn trong khi vẫn duy trì mức độ bảo mật cao bằng cách giữ cho access tokens có thời gian sống ngắn.

Nơi lưu trữ refresh token

Vì refresh tokens có thời hạn dài và cần dễ dàng bị thu hồi, chúng nên được lưu trữ trong một kho dữ liệu an toàn và bền vững.

  • Cơ sở dữ liệu: Đây là cách phổ biến và được khuyến nghị nhất. Một bảng chuyên dụng trong cơ sở dữ liệu của bạn có thể lưu trữ hash của refresh token, cùng với liên kết đến người dùng và các siêu dữ liệu như ngày hết hạn và địa chỉ IP. Việc hash token là cực kỳ quan trọng để bảo vệ chống lại các vụ vi phạm dữ liệu. Phương pháp này cũng làm cho việc thu hồi token dễ dàng bằng cách đơn giản là xóa mục trong cơ sở dữ liệu.

  • Redis hoặc Bộ nhớ cache: Đối với các ứng dụng có lưu lượng truy cập cao, một kho lưu trữ key-value nhanh như Redis là một lựa chọn tuyệt vời. Bạn có thể lưu trữ hash của refresh token dưới dạng key với thời gian sống (TTL) phù hợp. Điều này cung cấp một tìm kiếm rất nhanh trong quá trình làm mới token.

Việc lưu trữ refresh tokens trong cơ sở dữ liệu hoặc bộ nhớ cache an toàn rất quan trọng để cho phép thu hồi và đảm bảo tính toàn vẹn của luồng xác thực.

Thực tiễn tốt nhất

  • Sử dụng HTTPS: Đảm bảo rằng tất cả các giao tiếp với API đều diễn ra qua HTTPS để bảo vệ thông tin token.
  • Thời gian sống ngắn cho Access Token: Đặt thời gian sống cho access token càng ngắn càng tốt để giảm thiểu rủi ro.
  • Thực hiện kiểm tra rò rỉ token: Theo dõi và phát hiện các rò rỉ token để xử lý kịp thời.

Những cạm bẫy thường gặp

  • Lưu trữ token không an toàn: Tránh lưu trữ token trong Local Storage, vì nó dễ bị tấn công XSS.
  • Không thu hồi refresh token: Đảm bảo rằng refresh token được thu hồi đúng cách khi người dùng đăng xuất.

Mẹo hiệu suất

  • Sử dụng cache cho refresh token: Việc sử dụng cache có thể giúp tăng tốc độ truy xuất và giảm tải cho cơ sở dữ liệu.
  • Giảm số lần gọi API: Kết hợp các yêu cầu API để giảm tải cho server và tăng tốc độ phản hồi.

Giải quyết sự cố

  • Lỗi 401 Unauthorized: Kiểm tra xem access token có hợp lệ hay không và thực hiện luồng refresh nếu cần.
  • Lỗi thu hồi refresh token: Đảm bảo rằng refresh token chưa hết hạn và chưa bị thu hồi.

Kết luận

Việc hiểu rõ về Access Token và Refresh Token không chỉ giúp bạn xây dựng một hệ thống bảo mật tốt hơn mà còn cung cấp trải nghiệm người dùng liền mạch. Hãy áp dụng những kiến thức này vào dự án của bạn để đảm bảo an toàn cho ứng dụng của mình.

Câu hỏi thường gặp (FAQ)

1. Access Token và Refresh Token có thể bị thu hồi không?
Có, refresh token có thể bị thu hồi trong trường hợp người dùng đăng xuất hoặc thay đổi thông tin đăng nhập.

2. Có nên lưu trữ Access Token trong Local Storage không?
Không nên, vì Local Storage dễ bị tấn công XSS. Nên sử dụng cookie an toàn thay thế.

3. Thời gian sống của Refresh Token là bao lâu?
Thời gian sống của refresh token thường là vài ngày đến vài tuần, tùy thuộc vào yêu cầu bảo mật của ứng dụng.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào