Hỏi đáp

Refresh Token Rotation: Cải tiến phương thức xử lý Token

Huy Erick

Trong quá trình xử lý Token, Refresh Token Rotation là một kỹ thuật được sử dụng để lấy AccessToken mới thông qua việc sử dụng Refresh Token. Kỹ thuật này vượt xa khái niệm xác...

Trong quá trình xử lý Token, Refresh Token Rotation là một kỹ thuật được sử dụng để lấy AccessToken mới thông qua việc sử dụng Refresh Token. Kỹ thuật này vượt xa khái niệm xác thực im lặng (silent authentication). Thông thường, Refresh Token có tuổi thọ lâu hơn và được sử dụng để yêu cầu AccessToken mới sau khi AccessToken hiện tại hết hạn. Cụ thể, Refresh Token thường được sử dụng trong các ứng dụng di động trên thiết bị di động kết hợp với AccessToken có tuổi thọ ngắn để cung cấp trải nghiệm người dùng liền mạch mà không cần phải cấp AccessToken có tuổi thọ lâu.

Tuy nhiên, Refresh Token có tuổi thọ lâu có thể trở thành mục tiêu của các cuộc tấn công và gây nguy cơ cho việc truy cập trái phép vào tài nguyên. Để giảm thiểu nguy cơ này, Auth0 đã phát triển Refresh Token Rotation trong Auth0 Dashboard. Khi ứng dụng gửi một Refresh Token để lấy AccessToken mới, Auth0 sẽ trả về một Refresh Token mới, đồng thời vô hiệu hóa Refresh Token cũ. Điều này giúp giảm thiểu nguy cơ xâm nhập và tăng tính bảo mật cho hệ thống.

Cách hoạt động của Refresh Token Rotation

Khi sử dụng Refresh Token Rotation trong Auth0, mỗi lần ứng dụng trao đổi Refresh Token để lấy AccessToken mới, Auth0 sẽ trả về một Refresh Token mới. Điều này đồng nghĩa với việc bạn không cần phải quản lý một Refresh Token có tuổi thọ lâu, tiềm ẩn nguy cơ truy cập trái phép vào tài nguyên.

Cách hoạt động của Refresh Token Rotation trong Auth0 tuân thủ OAuth 2.0 BCP và hoạt động với các luồng sau:

Luồng Authorization Code Flow

Luồng Authorization Code Flow với xác minh Proof Key for Code Exchange

Luồng Device Authorization Flow

Luồng Resource Owner Password Flow

Trước đây, Single Page Applications (SPAs) duy trì phiên người dùng bằng cách sử dụng luồng Authorization Code Flow với PKCE kết hợp với xác thực im lặng (silent authentication). Tuy nhiên, với sự phát triển của công nghệ bảo mật trình duyệt, như Intelligent Tracking Prevention (ITP), việc truy cập vào cookie phiên Auth0 bị hạn chế, dẫn đến yêu cầu người dùng phải xác thực lại.

Giải pháp cho việc mất phiên người dùng

Refresh Token Rotation cung cấp một giải pháp cho việc mất phiên người dùng do các hiệu ứng phụ của cơ chế bảo mật trình duyệt. Vì Refresh Token Rotation không phụ thuộc vào việc truy cập vào cookie phiên Auth0, nên nó không bị ảnh hưởng bởi ITP hoặc các cơ chế tương tự.

Hình dưới đây mô tả quá trình hoạt động của Refresh Token Rotation khi được sử dụng kết hợp với luồng Authorization Code Flow với PKCE. Tuy nhiên, nguyên tắc chính của việc lấy Refresh Token mới áp dụng cho tất cả các luồng được hỗ trợ.

Hình 1: Quá trình Refresh Token Rotation duy trì phiên người dùng trong Single Page Applications

Điều này có nghĩa là bạn có thể sử dụng Refresh Token một cách an toàn để giảm thiểu các tác động tiêu cực của các công cụ bảo mật trình duyệt và cung cấp truy cập liên tục cho người dùng mà không làm gián đoạn trải nghiệm sử dụng.

Cơ chế bảo vệ chống lại cuộc tấn công

Khi một ứng dụng cần một AccessToken mới, nó gửi Refresh Token cùng với yêu cầu tới Auth0 để lấy cặp Token mới. Ngay khi Auth0 phát hành cặp Token mới, Refresh Token được sử dụng trong yêu cầu được vô hiệu hóa. Điều này giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công lặp lại (replay attack) do Token bị lộ.

Một điểm quan trọng cần lưu ý là, nếu không có hạn chế của người gửi (sender-constraint), máy chủ ủy quyền không thể biết được người gửi yêu cầu truy cập là người đáng tin cậy hay người độc hại trong trường hợp bị tấn công lặp lại. Chính vì vậy, việc vô hiệu hóa ngay lập tức Refresh Token mới nhất cũng là một điểm quan trọng, khi Refresh Token cũ (đã bị vô hiệu hóa) được gửi đến máy chủ ủy quyền. Điều này ngăn chặn việc sử dụng Refresh Token trong cùng họ Token (tất cả các Refresh Token được phát sinh từ Refresh Token gốc được phát hành cho ứng dụng) để lấy AccessToken mới.

Ví dụ, xem xét tình huống sau:

  1. Client đáng tin cậy có Refresh Token 1, và nó bị rò rỉ hoặc bị đánh cắp bởi Client độc hại.
  2. Client đáng tin cậy sử dụng Refresh Token 1 để lấy cặp Refresh Token/AccessToken mới.
  3. Auth0 trả về Refresh Token 2/AccessToken 2.
  4. Client độc hại sau đó cố gắng sử dụng Refresh Token 1 để lấy AccessToken. Auth0 nhận ra rằng Refresh Token 1 đang được tái sử dụng và vô hiệu hóa toàn bộ họ Token, bao gồm Refresh Token 2.
  5. Auth0 trả về phản hồi truy cập bị từ chối cho Client độc hại.
  6. AccessToken 2 hết hạn và Client đáng tin cậy cố gắng sử dụng Refresh Token 2 để yêu cầu cặp Token mới. Auth0 trả về phản hồi truy cập bị từ chối cho Client đáng tin cậy.
  7. Yêu cầu xác thực lại được yêu cầu.

Cơ chế bảo vệ này hoạt động mà không phụ thuộc vào việc Client đáng tin cậy hay Client độc hại có thể trao đổi Refresh Token 1 để lấy cặp Token mới trước. Ngay khi việc tái sử dụng được phát hiện, tất cả các yêu cầu tiếp theo sẽ bị từ chối cho đến khi người dùng xác thực lại. Auth0 cũng ghi lại các sự kiện phát hiện tái sử dụng (như log ferrt chỉ ra sự trao đổi thất bại) trong các nhật ký. Điều này đặc biệt hữu ích khi kết hợp với khả năng truyền log của Auth0 để phát hiện các hoạt động đáng ngờ.

Một ví dụ khác là khi Client độc hại lấy Refresh Token 1 và sử dụng thành công để lấy AccessToken trước khi Client đáng tin cậy cố gắng sử dụng Refresh Token 1. Trong trường hợp này, quyền truy cập của Client độc hại chỉ tồn tại trong một thời gian ngắn, vì Refresh Token 2 (hoặc bất kỳ Refresh Token nào được phát hành sau đó) sẽ được thu hồi tự động khi Client đáng tin cậy cố gắng sử dụng Refresh Token 1, như được hiển thị trong sơ đồ dưới đây:

Hình 2: Cơ chế phát hiện việc sử dụng lại Refresh Token

Các SDK sau đây đã tích hợp sẵn Refresh Token Rotation và cơ chế phát hiện việc tái sử dụng tự động:

  • Auth0 SPA SDK
  • Flutter (Web)
  • Swift (iOS) SDK
  • Android SDK
  • Flutter
  • React Native SDK
  • WPF/Winforms
  • Xamarin

Để biết thêm thông tin chi tiết về các SDK này, bạn có thể truy cập trang thư viện SDK của Auth0.

Lưu trữ Token và các Best Practices

Bạn có thể lựa chọn để lưu trữ Token trong bộ nhớ cục bộ (local storage) hoặc bộ nhớ của trình duyệt (browser memory). Mặc định, Token sẽ được lưu trữ trong bộ nhớ của trình duyệt. Tuy nhiên, Auth0 cũng cung cấp các khuyến nghị về Token Best Practices để giúp bạn quản lý Token một cách an toàn và hiệu quả. Để sử dụng Refresh Token, bạn cần bật tính năng truy cập offline và yêu cầu phạm vi truy cập offline trong SDK của ứng dụng khách.

Dưới đây là một số hướng dẫn liên quan:

  • Cấu hình Refresh Token Rotation
  • Vô hiệu hóa Refresh Token Rotation
  • Cấu hình thời gian hết hạn của Refresh Token
  • Token Best Practices

Đảm bảo an toàn và bảo mật cho ứng dụng của bạn là điều rất quan trọng. Với Refresh Token Rotation, Auth0 cung cấp một giải pháp tiên tiến để đảm bảo phiên người dùng được duy trì một cách liên tục trong môi trường trình duyệt hiện đại.

1