Mục đích của “Mã làm mới” là gì?


96

Tôi có một chương trình tích hợp với API phát trực tiếp trên YouTube. Nó chạy trên bộ hẹn giờ, vì vậy tôi tương đối dễ dàng lập trình để tìm nạp Mã truy cập mới cứ sau 50 phút bằng Mã làm mới. Câu hỏi của tôi là, tại sao?

Khi tôi xác thực với YouTube, nó đã cấp cho tôi một Mã làm mới. Sau đó, tôi sử dụng mã làm mới này để nhận Mã truy cập mới khoảng một lần một giờ. Nếu tôi có Mã thông báo làm mới, tôi LUÔN có thể sử dụng mã này để nhận Mã thông báo truy cập mới, vì nó không bao giờ hết hạn. Vì vậy, tôi không thấy cách này an toàn hơn là chỉ cấp cho tôi Mã thông báo truy cập ngay từ đầu và không bận tâm đến toàn bộ hệ thống Mã làm mới.



1
Mã thông báo truy cập là mã thông báo không mang . Có nghĩa là không cần nhận dạng nào khác và mã thông báo truy cập là tất cả những gì cần thiết để mạo danh bạn. Vì điều này, chúng nên luôn tồn tại trong thời gian ngắn. Mặt khác, các mã làm mới không phải là các mã không mang . Khi bạn gửi mã thông báo làm mới đến YouTube để nhận mã thông báo truy cập mới, bạn cũng phải gửi một client_id và client_secret. Do đó, mã thông báo làm mới có thể tồn tại lâu hơn vì ít có khả năng cả mã làm mới và client_secret bị xâm phạm.
jrahhali

Câu trả lời:


90

Về cơ bản, mã thông báo làm mới được sử dụng để nhận mã thông báo truy cập mới.

Để phân biệt rõ ràng hai mã thông báo này và tránh bị lẫn lộn, đây là các chức năng của chúng được cung cấp trong Khung ủy quyền OAuth 2.0 :

  • Mã thông báo truy cập được máy chủ ủy quyền cấp cho khách hàng bên thứ ba với sự chấp thuận của chủ sở hữu tài nguyên. Máy khách sử dụng mã thông báo truy cập để truy cập các tài nguyên được bảo vệ do máy chủ tài nguyên lưu trữ.
  • Mã làm mới là thông tin đăng nhập được sử dụng để lấy mã thông báo truy cập. Mã làm mới được máy chủ ủy quyền cấp cho khách hàng và được sử dụng để lấy mã thông báo truy cập mới khi mã thông báo truy cập hiện tại trở nên không hợp lệ hoặc hết hạn hoặc để nhận mã truy cập bổ sung có phạm vi giống hệt hoặc hẹp hơn.

Bây giờ, để trả lời câu hỏi của bạn về lý do tại sao bạn vẫn được cấp mã thông báo làm mới thay vì chỉ bảo mật mã thông báo truy cập, lý do chính được cung cấp bởi Lực lượng đặc nhiệm kỹ thuật Internet trong Làm mới mã thông báo là:

Có một lý do bảo mật, cái refresh_tokenchỉ được trao đổi với máy chủ ủy quyền trong khi cái access_tokenđược trao đổi với máy chủ tài nguyên. Điều này làm giảm nguy cơ bị rò rỉ access_token tồn tại trong một thời gian dài trong "mã thông báo truy cập tốt trong một giờ, với mã thông báo làm mới tốt trong một năm hoặc tốt cho đến khi bị thu hồi" so với "mã thông báo truy cập tốt cho đến khi bị thu hồi mà không cần làm mới mã thông báo."

Để có thông tin chi tiết và đầy đủ hơn về Luồng OAuth 2.0, vui lòng thử xem qua các phần tham khảo sau:


5
Có nên làm mới mã thông báo cũng giúp nhận mã làm mới mới không?
Gherman

5
Tại sao không có được một access_token mới tồn tại trong thời gian ngắn khi nó hết hạn? Tại sao lại có refresh_token tồn tại lâu dài nếu bạn vẫn cần yêu cầu máy chủ cấp một access_token mới? Hay đúng là với refresh_token, tôi không cần duy trì cookie của nhà cung cấp danh tính còn tồn tại và nó phát hành access_tokens mới dựa trên refresh_token ngay cả sau khi cookie đã biến mất từ ​​lâu và người dùng sẽ phải nhập thông tin đăng nhập của mình nếu họ muốn nhận được access_token mới?
JustAMartin

2
@JustAMartin Với tư cách là Ứng dụng khách OAuth2, không có mã thông báo làm mới, tôi sẽ cần bắt đầu lại toàn bộ quy trình cấp quyền (yêu cầu người dùng 'đăng nhập' và cấp lại quyền cho tôi), để có được mã thông báo truy cập khác. Làm mới mã thông báo bỏ qua yêu cầu này như một loại 'bằng chứng' rằng tôi, với tư cách là Khách hàng, đã nhận được quyền của Người dùng để yêu cầu mã thông báo truy cập.
jrahhali

mã thông báo làm mới có thể có dữ liệu giống hệt hoặc giống với mã thông báo truy cập không? vì công dụng chính của mã thông báo làm mới là để giảm trải nghiệm người dùng và hạn chế thời gian truy cập của tin tặc vào tài nguyên.
DaviesTobi alex

8

@Teyam đề cập đến SO post Tại sao OAuth v2 có cả mã thông báo truy cập và làm mới? nhưng tôi thích câu trả lời khác ở đó: https://stackoverflow.com/a/12885823/254109

TL; DR refresh_token không tăng cường bảo mật. Nó nhằm mục đích cải thiện khả năng mở rộng và hiệu suất. Sau đó, access_tokencó thể được lưu trữ chỉ trong một số bộ nhớ nhanh, tạm thời (như bộ nhớ). Nó cũng cho phép phân tách máy chủ tài nguyên và ủy quyền.


3
ngoại trừ có lý do bảo mật, như @Teyam đã đề cập: "refresh_token chỉ được trao đổi với máy chủ ủy quyền trong khi access_token được trao đổi với máy chủ tài nguyên"
huyz

Điều này chỉ an toàn hơn nếu chúng tôi cho rằng máy chủ ủy quyền bằng cách nào đó được bảo mật tốt hơn như máy chủ tài nguyên. Nếu không phải như vậy thì nó thực sự kém an toàn hơn. Mã thông báo làm mới bị xâm phạm, tôi chỉ có thể sử dụng mã đó để lấy mã thông báo truy cập mới.
Arno van Lieshout

6

"Vì vậy, tôi không thấy cách này an toàn hơn là chỉ cấp cho tôi Mã thông báo truy cập ngay từ đầu và không làm phiền đến toàn bộ hệ thống Mã làm mới." Tôi đã đấu tranh với cùng một câu hỏi. Câu trả lời ngắn gọn là mã làm mới là cần thiết để đảm bảo thông tin đăng nhập chưa hết hạn.

Một ví dụ có thể hữu ích: Tôi có một cơ sở dữ liệu lưu trữ hồ sơ y tế của bạn. Bạn đồng ý chia sẻ hồ sơ y tế của bạn với vợ / chồng của bạn. Vợ / chồng của bạn sử dụng Mã truy cập của họ để đọc hồ sơ của bạn từ cơ sở dữ liệu của tôi. Hai tuần kể từ bây giờ vợ / chồng của bạn kiểm tra lại hồ sơ y tế của bạn và mã thông báo làm mới được sử dụng để đảm bảo họ vẫn có quyền (từ máy chủ xác thực) để xem hồ sơ của bạn. Mã thông báo làm mới bỏ qua yêu cầu vợ / chồng của bạn phải nhập lại thông tin đăng nhập của họ (tên người dùng và mật khẩu) vào máy chủ xác thực, nhưng nó đảm bảo họ vẫn có tính hợp pháp để truy cập tài nguyên. Mã thông báo truy cập không bao giờ hết hạn sẽ không biết bạn đã thu hồi quyền truy cập hồ sơ y tế của vợ / chồng bạn hay chưa.


6

Mã thông báo làm mới phục vụ ít nhất hai mục đích. Đầu tiên, mã thông báo làm mới là một loại 'bằng chứng' cho thấy Ứng dụng khách OAuth2 đã nhận được quyền từ người dùng để truy cập vào dữ liệu của họ và do đó, có thể yêu cầu lại mã thông báo truy cập mới mà không yêu cầu người dùng thực hiện toàn bộ quy trình OAuth2. Và thứ hai, nó giúp tăng toàn bộ quy trình bảo mật khi so sánh với mã thông báo truy cập tồn tại lâu dài. Tôi sẽ đề cập chi tiết hơn về cả hai điểm này.

Làm mới mã thông báo như một phương tiện để không làm phiền người dùng

Hãy nói về mục đích đầu tiên với một ví dụ. Giả sử bạn, một Người dùng, đang sử dụng ứng dụng web Máy khách của bên thứ ba muốn tương tác với dữ liệu tài khoản YouTube của bạn. Sau khi cấp quyền cho ứng dụng Khách sử dụng dữ liệu YouTube của mình, bạn có muốn ứng dụng Khách nhắc lại quyền của bạn khôngkhi mã thông báo YouTube của nó hết hạn? Điều gì sẽ xảy ra nếu thời gian hết hạn mã thông báo YouTube là rất thấp, chẳng hạn như 5 phút. Sẽ hơi khó chịu khi ứng dụng Khách hàng nhắc bạn cho phép ít nhất 5 phút một lần! Giải pháp mà OAuth2 đề xuất cho 'vấn đề' này là làm mới mã thông báo. Bằng cách sử dụng mã thông báo làm mới, mã thông báo truy cập có thể tồn tại trong thời gian ngắn (điều này mong muốn trong trường hợp mã thông báo truy cập bị rò rỉ hoặc bị đánh cắp bằng cách nào đó) và mã làm mới có thể vẫn tồn tại lâu (er), cho phép Khách hàng có được quyền truy cập mới mã thông báo khi hết hạn mà không yêu cầu sự cho phép của người dùng (một lần nữa).

Nhưng tại sao lại là một mã thông báo làm mới? Nếu vấn đề là không gây lỗi cho Người dùng với các yêu cầu cấp quyền, thì tại sao Khách hàng không thể chỉ nói "Này, Máy chủ cấp quyền, tôi muốn một mã thông báo truy cập khác. Bây giờ!"? Hoặc, "Này Máy chủ Ủy quyền, đây là mã thông báo đã hết hạn của tôi, hãy cho tôi một mã mới!". Vâng, mã thông báo làm mới đóng vai trò như một loại "bằng chứng" rằng Khách hàng tại một thời điểm ban đầu nào đó đã được Người dùng cấp quyền truy cập. "Bằng chứng" này ở dạng mã thông báo làm mới được ký điện tử bởi Máy chủ ủy quyền. Bằng cách Khách hàng xuất trình mã thông báo làm mới, Máy chủ Ủy quyền có thể xác minh rằng Khách hàng đã nhận được quyền từ Người dùng, tại một thời điểm nào đó trong quá khứ và Khách hàng không phải nhắc lại Người dùng.

Làm mới mã thông báo như một phương tiện để tăng cường bảo mật

Tuy nhiên, điều này đặt ra câu hỏi, "Chà, điều gì sẽ xảy ra nếu mã thông báo làm mới bị rò rỉ hoặc bị đánh cắp hoặc đơn giản là do một ứng dụng Client độc hại giữ lại mà không loại bỏ nó theo yêu cầu của người dùng? Kẻ tấn công không thể tiếp tục sử dụng mã làm mới để đạt được mã truy cập hợp lệ vô thời hạn (hoặc cho đến khi nó hết hạn)? Câu hỏi này dẫn đến thảo luận về mục đích thứ hai mà tôi đã đề cập, làm mới mã thông báo góp phần tạo ra một quy trình an toàn hơn.

Vấn đề nảy sinh với mã thông báo truy cập là sau khi được mua, chúng chỉ được trình bày với Máy chủ tài nguyên (YouTube chẳng hạn). Vì vậy, nếu mã thông báo truy cập bị đánh cắp hoặc bị xâm phạm, làm thế nào để bạn nói với Máy chủ tài nguyên không tin tưởng mã thông báo đó? Chà, bạn không thể thực sự. Cách duy nhất để làm điều đó là thay đổi khóa ký riêng tư trên Máy chủ ủy quyền (khóa đã ký mã thông báo ngay từ đầu). Tôi nghĩ rằng điều này là không thuận tiện để thực hiện và trong một số trường hợp (như Auth0), không được hỗ trợ.

Mặt khác, mã thông báo làm mới cần được xuất trình cho Máy chủ cấp quyền thường xuyên và vì vậy nếu một mã bị xâm phạm, thì việc thu hồi hoặc từ chối toàn bộ mã thông báo làm mới là điều nhỏ nhặt và không phải thay đổi bất kỳ khóa ký nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.