Nếu Hacker lấy được cả Access Token và Refresh Token rồi tự đi làm mới token thì sao?
Khi bắt đầu tìm hiểu về JWT Authentication, rất nhiều lập trình viên được giới thiệu về hai khái niệm quen thuộc là Access Token và Refresh Token. Mô hình này xuất hiện trong hầu hết các hệ thống hiện đại, từ mạng xã hội, ứng dụng ngân hàng cho đến các nền tảng SaaS quy mô lớn.
Tuy nhiên, có một câu hỏi thú vị mà không phải bài viết nào cũng đề cập:
Nếu hacker lấy được cả Access Token và Refresh Token thì điều gì sẽ xảy ra?
Để trả lời câu hỏi này, trước tiên chúng ta cần hiểu rõ vai trò của từng loại token.

Access Token là gì?
Access Token là một loại thông tin xác thực được cấp sau khi người dùng đăng nhập thành công. Token này được gửi kèm theo các yêu cầu tới máy chủ để chứng minh rằng người dùng đã được xác thực.
Có thể hình dung Access Token giống như một chiếc vé vào cổng. Miễn là chiếc vé còn hiệu lực, hệ thống sẽ cho phép người dùng truy cập vào các tài nguyên được cấp quyền.
Thông thường Access Token có thời gian sống khá ngắn, dao động từ vài phút đến vài giờ tùy theo thiết kế của hệ thống. Việc giới hạn thời gian sử dụng giúp giảm thiểu rủi ro nếu token bị đánh cắp.
Đây cũng là lý do các hệ thống hiện đại không thích sử dụng những token có thời hạn quá dài.

Refresh Token là gì?
Nếu Access Token có thời gian sống ngắn, vậy làm sao người dùng có thể duy trì trạng thái đăng nhập trong nhiều ngày hoặc nhiều tuần?
Đó là lúc Refresh Token xuất hiện.
Refresh Token được sử dụng để yêu cầu cấp một Access Token mới khi Access Token cũ hết hạn. Nhờ vậy người dùng không cần đăng nhập lại liên tục.
Thay vì bắt người dùng nhập mật khẩu mỗi 15 phút, hệ thống chỉ cần sử dụng Refresh Token để tạo ra Access Token mới trong nền.
Kết quả là trải nghiệm người dùng được cải thiện đáng kể trong khi vẫn duy trì được mức độ bảo mật cao hơn so với việc kéo dài thời gian sống của Access Token.

Tại sao không dùng một token duy nhất?
Đây là câu hỏi rất phổ biến.
Giả sử hệ thống chỉ sử dụng một JWT có thời hạn 30 ngày. Nếu token này bị đánh cắp, kẻ tấn công có thể sử dụng nó trong suốt 30 ngày mà không gặp bất kỳ trở ngại nào.
Ngược lại, khi áp dụng mô hình Access Token và Refresh Token, Access Token chỉ tồn tại trong thời gian ngắn. Nếu bị lộ, thiệt hại sẽ được giới hạn đáng kể.
Nói cách khác, mô hình hai token được tạo ra nhằm cân bằng giữa trải nghiệm người dùng và tính bảo mật.
Nếu hacker lấy được Access Token thì sao?
Đây là tình huống tương đối phổ biến.
Nếu Access Token bị lộ, kẻ tấn công có thể sử dụng token đó để gửi yêu cầu tới hệ thống trong khoảng thời gian token còn hiệu lực.
Tuy nhiên, vì Access Token thường có thời gian sống ngắn nên mức độ ảnh hưởng cũng bị giới hạn. Sau khi token hết hạn, hacker sẽ không thể tiếp tục truy cập nếu không có thêm thông tin xác thực khác.
Đó là lý do các chuyên gia bảo mật luôn khuyến nghị sử dụng Access Token ngắn hạn thay vì kéo dài thời gian sử dụng.
Nếu hacker lấy được cả Access Token và Refresh Token thì sao?
Đây mới là phần thú vị.
Trong trường hợp hacker sở hữu cả Access Token và Refresh Token hợp lệ, về lý thuyết họ có thể hoạt động giống như người dùng thật.
Khi Access Token hết hạn, hacker hoàn toàn có thể sử dụng Refresh Token để yêu cầu cấp Access Token mới. Quá trình này có thể tiếp tục cho đến khi Refresh Token hết hạn hoặc bị thu hồi.
Điều đó có nghĩa là nếu cả hai token đều bị đánh cắp, phiên đăng nhập gần như đã bị xâm phạm.
Tuy nhiên, các hệ thống hiện đại không chỉ dựa vào việc cấp token đơn thuần.

Refresh Token Rotation là gì?
Một trong những cơ chế bảo mật phổ biến hiện nay là Refresh Token Rotation.
Thay vì cho phép một Refresh Token được sử dụng vô thời hạn cho đến ngày hết hạn, hệ thống sẽ tạo ra một Refresh Token mới mỗi lần thực hiện làm mới phiên đăng nhập.
Khi token mới được tạo, token cũ sẽ bị vô hiệu hóa ngay lập tức.
Nhờ cơ chế này, mỗi Refresh Token chỉ có thể được sử dụng một lần.
Điều này giúp giảm đáng kể khả năng khai thác token bị đánh cắp.

Reuse Detection hoạt động như thế nào?
Refresh Token Rotation vẫn tồn tại một vấn đề.
Nếu hacker sử dụng Refresh Token trước người dùng thật, hacker sẽ nhận được token mới còn người dùng sẽ gặp lỗi khi cố gắng làm mới phiên đăng nhập.
Để giải quyết tình huống này, nhiều hệ thống triển khai thêm cơ chế Reuse Detection.
Khi một Refresh Token đã được sử dụng và bị vô hiệu hóa nhưng lại xuất hiện lần nữa, hệ thống có thể kết luận rằng token đã bị sao chép hoặc bị đánh cắp.
Lúc này máy chủ có thể thực hiện nhiều biện pháp như thu hồi phiên đăng nhập, yêu cầu xác thực lại hoặc thậm chí đăng xuất toàn bộ thiết bị liên quan.
Mục tiêu không phải ngăn hacker sử dụng token ngay lập tức mà là phát hiện sớm các dấu hiệu bất thường.

Một tài khoản đăng nhập nhiều thiết bị thì sao?
Trong thực tế, người dùng thường đăng nhập trên nhiều thiết bị khác nhau như điện thoại, laptop hoặc máy tính bảng.
Nếu tất cả thiết bị cùng chia sẻ một Refresh Token, việc quản lý bảo mật sẽ trở nên rất phức tạp.
Vì vậy các hệ thống hiện đại thường quản lý Refresh Token theo từng phiên đăng nhập riêng biệt.
Mỗi thiết bị sẽ có một phiên riêng, một Refresh Token riêng và có thể bị thu hồi độc lập.
Nếu điện thoại bị mất hoặc token trên điện thoại bị lộ, hệ thống chỉ cần vô hiệu hóa phiên đó mà không ảnh hưởng đến các thiết bị còn lại.
Đây cũng là nền tảng cho tính năng "Thiết bị đang đăng nhập" mà chúng ta thường thấy trên các ứng dụng lớn.
Vì sao nhiều hệ thống vẫn lưu Session?
Nhiều lập trình viên cho rằng JWT hoàn toàn có thể thay thế Session.
Trên thực tế, các hệ thống quy mô lớn thường kết hợp cả hai.
Access Token thường được sử dụng để xác thực nhanh và giảm tải cho máy chủ.
Trong khi đó Refresh Token thường được liên kết với một Session được lưu trữ trong cơ sở dữ liệu.
Nhờ vậy hệ thống có thể chủ động thu hồi quyền truy cập, quản lý thiết bị đăng nhập và xử lý các tình huống bảo mật một cách linh hoạt hơn.
Kết luận
Access Token và Refresh Token không phải là giải pháp giúp hệ thống trở nên bất khả xâm phạm. Chúng chỉ là một phần trong kiến trúc xác thực hiện đại nhằm cân bằng giữa trải nghiệm người dùng và bảo mật.
Nếu Access Token bị đánh cắp, thiệt hại được giới hạn nhờ thời gian sống ngắn. Nếu Refresh Token bị đánh cắp, các cơ chế như Rotation, Reuse Detection và Session Management sẽ giúp phát hiện và giảm thiểu rủi ro.
Và quan trọng nhất, nếu hacker lấy được cả Access Token lẫn Refresh Token hợp lệ, hãy xem đó là một phiên đăng nhập đã bị xâm phạm. Khi đó nhiệm vụ của hệ thống không còn là ngăn chặn hoàn toàn mà là phát hiện nhanh, thu hồi nhanh và hạn chế tối đa hậu quả có thể xảy ra.
