tl; dr: Đây là tất cả vì lý do bảo mật.
OAuth 2.0 muốn đáp ứng hai tiêu chí sau:
- Bạn muốn cho phép các nhà phát triển sử dụng URI chuyển hướng không HTTPS vì không phải tất cả các nhà phát triển đều có máy chủ hỗ trợ SSL và nếu họ không luôn luôn được định cấu hình đúng (chứng chỉ SSL không tự ký, chứng chỉ SSL đáng tin cậy, đồng hồ máy chủ được đồng bộ hóa ...).
- Bạn không muốn tin tặc có thể đánh cắp các mã thông báo truy cập / làm mới bằng cách chặn các yêu cầu.
Chi tiết bên dưới:
Luồng ngầm chỉ có thể có trong môi trường trình duyệt vì lý do bảo mật:
Trong luồng ngầm định , mã thông báo truy cập được truyền trực tiếp dưới dạng một đoạn băm (không phải là tham số URL). Một điều quan trọng về đoạn băm là, một khi bạn theo liên kết có chứa đoạn băm, chỉ có trình duyệt biết về đoạn băm. Các trình duyệt sẽ chuyển đoạn băm trực tiếp đến trang web đích (URI chuyển hướng / trang web của khách hàng). Đoạn băm có các thuộc tính sau:
- Chúng không phải là một phần của yêu cầu HTTP do đó chúng không thể được đọc bởi máy chủ và do đó chúng không thể bị chặn bởi các máy chủ / bộ định tuyến trung gian (điều này rất quan trọng).
- Chúng chỉ tồn tại trên trình duyệt - phía máy khách - vì vậy cách duy nhất để đọc đoạn băm là sử dụng JavaScript chạy trên trang.
Điều này cho phép truyền trực tiếp Mã thông báo truy cập đến máy khách mà không có nguy cơ bị máy chủ trung gian chặn. Điều này có sự cảnh báo chỉ là phía khách hàng có thể và cần javascript chạy phía máy khách để sử dụng mã thông báo truy cập.
Luồng ẩn cũng có các vấn đề bảo mật đòi hỏi logic hơn nữa để khắc phục / tránh:
- Kẻ tấn công có thể nhận được mã thông báo truy cập từ người dùng trên một trang web / ứng dụng khác (giả sử nếu anh ta là chủ sở hữu của trang web / ứng dụng khác), đăng nhập mã thông báo trên trang web của họ và sau đó chuyển nó dưới dạng thông số URL trên trang web của bạn do đó mạo danh người dùng trên trang web của bạn. Để tránh điều này, bạn cần kiểm tra ID khách hàng được liên kết với mã thông báo truy cập (ví dụ: Google, bạn có thể sử dụng điểm cuối tokeninfo) để đảm bảo mã thông báo được cấp với ID khách hàng của riêng bạn (tức là bằng ứng dụng của riêng bạn) hoặc kiểm tra chữ ký nếu bạn đang sử dụng IDToken (nhưng điều đó đòi hỏi bí mật của khách hàng của bạn).
- Nếu yêu cầu xác thực không bắt nguồn từ tài sản của riêng bạn (được gọi là các cuộc tấn công Sửa lỗi phiên), để tránh điều này, bạn sẽ muốn tạo một hàm băm ngẫu nhiên từ trang web của mình, hãy lưu nó vào cookie và chuyển cùng hàm băm đó trong thông số URL trạng thái của yêu cầu xác thực, khi người dùng quay lại, bạn kiểm tra thông số trạng thái với cookie và nó phải khớp.
Trong luồng mã ủy quyền , không thể chuyển trực tiếp mã thông báo truy cập trong tham số URL vì tham số URL là một phần của Yêu cầu HTTP, do đó, bất kỳ máy chủ / bộ định tuyến trung gian nào mà yêu cầu của bạn sẽ vượt qua (có thể là hàng trăm) đọc mã thông báo truy cập nếu bạn không sử dụng kết nối được mã hóa (HTTPS) cho phép những gì được gọi là tấn công trung gian.
Về mặt lý thuyết, việc chuyển mã thông báo truy cập trong một thông số URL có thể khả thi nhưng auth sever sẽ phải đảm bảo URI chuyển hướng đang sử dụng HTTPS với mã hóa TLS và chứng chỉ SSL 'đáng tin cậy' (thường là từ Cơ quan cấp chứng chỉ không miễn phí) để chắc chắn rằng máy chủ đích là hợp pháp và yêu cầu HTTP được mã hóa hoàn toàn. Việc tất cả các nhà phát triển mua chứng chỉ SSL và định cấu hình SSL đúng cách trên miền của họ sẽ là một nỗi đau lớn và sẽ làm chậm quá trình áp dụng. Đây là lý do tại sao một "mã ủy quyền" sử dụng một lần trung gian được cung cấp rằng chỉ người nhận hợp pháp mới có thể trao đổi (vì bạn cần bí mật của khách hàng) và mã sẽ vô dụng đối với các tin tặc tiềm năng chặn các yêu cầu đối với các giao dịch không được mã hóa (vì họ không '
Bạn cũng có thể lập luận rằng luồng ngầm là kém an toàn hơn, có các vectơ tấn công tiềm năng như giả mạo tên miền khi chuyển hướng - ví dụ: bằng cách chiếm đoạt địa chỉ IP của trang web của khách hàng. Đây là một trong những lý do tại sao luồng ngầm chỉ cấp mã thông báo truy cập (được cho là có thời gian sử dụng hạn chế) và không bao giờ làm mới mã thông báo (không giới hạn thời gian). Để khắc phục vấn đề này, tôi khuyên bạn nên lưu trữ các trang web của mình trên máy chủ hỗ trợ HTTPS bất cứ khi nào có thể.