Access token và refresh token: So sánh vai trò, cách dùng

Khi tích hợp Zalo API hoặc một hệ thống sử dụng OAuth 2.0, lập trình viên thường nhận được hai loại thông tin xác thực là access token và refresh token. Chúng có thể được cấp trong cùng một phản hồi nhưng không cùng mục đích. Access token dùng để truy cập API, còn refresh token dùng để xin access token mới khi token hiện tại hết hạn hoặc sắp hết hạn.

Hiểu đúng cặp token này giúp ứng dụng duy trì kết nối ổn định mà không bắt người dùng đăng nhập lại liên tục. Nếu lưu trữ sai, dùng nhầm endpoint hoặc bỏ qua cơ chế làm mới, hệ thống có thể bị gián đoạn và phát sinh rủi ro bảo mật.

Access token và refresh token là gì?

Access token là gì?

Access token là chuỗi xác thực được máy chủ ủy quyền cấp cho ứng dụng sau khi người dùng hoặc chủ tài nguyên đồng ý cấp quyền. Khi gọi Zalo API, ứng dụng gửi access token theo cơ chế endpoint yêu cầu. Máy chủ sẽ kiểm tra token, phạm vi quyền, trạng thái và thời hạn trước khi trả dữ liệu.

Access token có thể đại diện cho người dùng, ứng dụng, Zalo Official Account hoặc một ngữ cảnh tích hợp cụ thể. Token không phải mật khẩu Zalo, nhưng người sở hữu token hợp lệ có thể thực hiện các thao tác nằm trong phạm vi đã được cấp.

Một access token thường gắn với:

  • Đối tượng được cấp quyền.
  • Ứng dụng được phép sử dụng token.
  • Phạm vi quyền hoặc scope.
  • Thời điểm phát hành và hết hạn.
  • Trạng thái còn hiệu lực hay đã bị thu hồi.

Khi access token hết hạn, API thường trả lỗi xác thực. Ứng dụng cần nhận diện đúng trường hợp này để chuyển sang luồng làm mới thay vì lặp lại yêu cầu cũ.

Refresh token là gì?

Access token và refresh token - Access token là gì?
Access token và refresh token – Access token là gì?

Refresh token là chuỗi xác thực dùng để yêu cầu máy chủ cấp access token mới. Nhờ refresh token, ứng dụng có thể duy trì quyền truy cập mà không yêu cầu người dùng thực hiện lại toàn bộ quá trình đăng nhập và đồng ý cấp quyền.

Refresh token không dùng để gọi trực tiếp các API nghiệp vụ. Nó chỉ nên được gửi đến endpoint cấp hoặc làm mới token. Vì thường có vòng đời dài hơn access token, refresh token cũng cần được bảo vệ nghiêm ngặt hơn.

Bảng so sánh access token và refresh token

Tiêu chí Access token Refresh token
Mục đích Gọi API và truy cập tài nguyên Xin access token mới
Nơi sử dụng Endpoint tài nguyên Endpoint cấp hoặc làm mới token
Thời hạn Thường ngắn hơn Thường dài hơn
Tần suất dùng Dùng trong nhiều yêu cầu API Chỉ dùng khi cần làm mới
Mức độ nhạy cảm Cao Rất cao
Khi bị lộ Có thể bị khai thác đến khi hết hạn hoặc bị thu hồi Có thể tiếp tục tạo access token mới
Vị trí lưu Backend hoặc vùng lưu trữ an toàn Backend hoặc kho bí mật
Khi hết hạn Dùng refresh token để xin token mới Phải cấp quyền lại nếu không thể refresh

Khác biệt cốt lõi là access token đóng vai trò “vé truy cập”, còn refresh token là “chìa khóa gia hạn”. Hai token không thay thế nhau và không nên được truyền, lưu hoặc ghi log theo cùng một cách.

Với Zalo API, thời hạn cụ thể có thể phụ thuộc vào loại API, tài khoản, phiên bản nền tảng và chính sách hiện hành. Không nên hardcode một con số cố định. Ứng dụng cần đọc thời hạn từ phản hồi của máy chủ rồi tính thời điểm hết hạn.

Luồng OAuth với hai loại token

Access token và refresh token - Bảng so sánh access token và refresh token
Access token và refresh token – Bảng so sánh access token và refresh token

Bước 1: Yêu cầu cấp quyền

Ứng dụng tạo đường dẫn ủy quyền chứa mã ứng dụng, callback URL, phạm vi quyền và giá trị state. Người dùng đăng nhập Zalo, xem quyền được yêu cầu rồi đồng ý hoặc từ chối.

state cần được tạo ngẫu nhiên, gắn với phiên yêu cầu và kiểm tra lại khi người dùng quay về callback. Đây là lớp bảo vệ quan trọng trước nguy cơ giả mạo luồng cấp quyền.

Bước 2: Nhận authorization code

Sau khi người dùng đồng ý, máy chủ chuyển hướng về callback URL kèm authorization code. Mã này thường chỉ có hiệu lực trong thời gian ngắn và được sử dụng một lần.

Backend phải kiểm tra state trước khi xử lý code. Authorization code không phải access token và không được dùng để gọi API tài nguyên.

Bước 3: Đổi code lấy token

Backend gửi authorization code đến token endpoint cùng các thông tin xác thực nền tảng yêu cầu. Nếu hợp lệ, máy chủ có thể trả access token, refresh token, thời hạn và các trường liên quan.

Ngay sau khi nhận phản hồi, hệ thống cần lưu token an toàn. Refresh token nên được mã hóa hoặc đặt trong kho quản lý bí mật, chỉ dịch vụ backend có thẩm quyền mới được truy cập.

Bước 4: Gọi Zalo API

Access token và refresh token - Bước 3: Đổi code lấy token
Access token và refresh token – Bước 3: Đổi code lấy token

Ứng dụng dùng access token để gọi endpoint nghiệp vụ. Trước khi gửi yêu cầu, hệ thống kiểm tra thời điểm hết hạn. Nếu token còn hiệu lực, yêu cầu được thực hiện bình thường; nếu sắp hết hạn, ứng dụng chuyển sang bước làm mới.

Nên làm mới trước thời điểm hết hạn một khoảng nhỏ để tránh token mất hiệu lực giữa lúc yêu cầu đang xử lý. Khoảng đệm cần vừa đủ, không quá lớn khiến hệ thống refresh thường xuyên.

Bước 5: Làm mới token

Backend gửi refresh token đến token endpoint. Nếu token, ứng dụng và trạng thái phiên đều hợp lệ, máy chủ trả access token mới và có thể kèm refresh token mới.

Nếu phản hồi chứa refresh token mới, ứng dụng phải thay thế token cũ. Chỉ lưu access token mới nhưng bỏ qua refresh token mới có thể khiến lần làm mới tiếp theo thất bại.

Bước 6: Cấp quyền lại khi cần

Refresh token có thể hết hạn, bị thu hồi hoặc mất hiệu lực khi người dùng ngắt liên kết hay nền tảng cập nhật chính sách. Khi đó, ứng dụng phải đưa người dùng trở lại luồng cấp quyền.

Không nên lặp yêu cầu refresh vô hạn. Sau một số lần thử có kiểm soát, hệ thống cần đánh dấu kết nối cần xác thực lại và thông báo rõ cho quản trị viên.

Thời hạn và thời điểm nên làm mới

Access token thường có thời hạn ngắn để giảm thiệt hại nếu bị lộ. Refresh token tồn tại lâu hơn nhằm duy trì phiên, nhưng không phải thông tin xác thực vĩnh viễn và vẫn có thể bị thu hồi trước thời hạn.

Ứng dụng nên lưu thời điểm nhận token và thời hạn máy chủ trả về. Có thể tính:

expires_at = received_at + expires_in
refresh_at = expires_at - safety_margin cùng zalo web đăng nhập.
Rate this post

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *