Có nên sử dụng cookie trong API RESTful?


77

Tôi đặc biệt quan tâm đến cách người dùng thực hiện các hoạt động được ủy quyền / xác thực trên API web.

Các cookie xác thực có tương thích với triết lý REST không, và tại sao?


bản sao chính xác của xác thực yên tĩnh


1
@JarrodRoberson Sự hiểu biết của tôi là câu trả lời trên một trang web khác sẽ không đủ điều kiện cho câu hỏi trùng lặp ở đây
Tom Squires

5
@JarrodRoberson dựa trên Câu hỏi thường gặp của mỗi trang web, tôi sẽ tranh luận câu hỏi thuộc về trang web này chứ không phải Stack Overflow. Tôi quan tâm đến phương pháp / triết lý thiết kế và sự đánh đổi liên quan đến khía cạnh này của kiến ​​trúc RESTful. Stack Overflow có nghĩa là cho các câu hỏi triển khai, trong đó trang web này nói nhiều hơn về phương pháp thiết kế và sự đánh đổi.
Brandon Linton

1
Tôi đồng ý với @BrandonLinton ở đây, câu hỏi quá rộng đối với Stackoverflow, đây là một câu hỏi liên quan đến kiến ​​trúc và phương pháp thiết kế. OP muốn thực hành tốt nhất và các mẫu, đề xuất và gotchas - không phải là một câu trả lời cụ thể - do đó không có ngôn ngữ nào được chỉ định. Do đó, nó thuộc về đây.
dooburt

Câu trả lời:


81

Dịch vụ ReSTful lý tưởng cho phép khách hàng (có thể không có trong trình duyệt) thực hiện bất kỳ tác vụ cần thiết nào trong một yêu cầu ; bởi vì trạng thái đầy đủ cần thiết để làm điều đó được giữ bởi máy khách, không phải máy chủ. Vì máy khách có toàn quyền kiểm soát trạng thái, nó có thể tự tạo trạng thái (nếu điều đó là hợp pháp) và chỉ nói chuyện với API để "hoàn thành công việc".

Yêu cầu cookie có thể làm cho điều đó khó khăn. Đối với khách hàng ngoài trình duyệt, việc quản lý cookie là một bất tiện khá lớn so với thông số truy vấn, tiêu đề yêu cầu đơn giản hoặc nội dung yêu cầu. Mặt khác, trong trình duyệt, sử dụng cookie có thể làm cho nhiều việc đơn giản hơn nhiều.

Vì vậy, API trước tiên có thể tìm trong Authorizationtiêu đề cho dữ liệu xác thực mà nó cần, vì đó có thể là nơi mà các máy khách không có trình duyệt sẽ thích đặt nó, nhưng để đơn giản hóa và hợp lý hóa các máy khách dựa trên trình duyệt, nó cũng có thể kiểm tra cookie phiên cho đăng nhập phía máy chủ, nhưng chỉ khi Authorizationtiêu đề thông thường bị thiếu.

Một ví dụ khác có thể là một yêu cầu phức tạp thường yêu cầu nhiều tham số được đặt. Một khách hàng không tương tác sẽ không gặp khó khăn khi kẹt tất cả dữ liệu đó vào một yêu cầu, nhưng giao diện dựa trên biểu mẫu HTML có thể thích chia yêu cầu thành nhiều trang (giống như một tập các trang 'wizard') để người dùng không trình bày với các tùy chọn không áp dụng được dựa trên các lựa chọn trước đó. Tất cả các trang trung gian có thể lưu trữ các giá trị trong cookie phía máy khách, do đó chỉ có trang cuối cùng, nơi người dùng thực sự gửi yêu cầu, có bất kỳ tác dụng phụ nào của máy chủ. API có thể tìm kiếm các thuộc tính cần thiết trong thân yêu cầu và quay lại xem cookie nếu các tham số cần thiết không có ở đó.

Chỉnh sửa: trong RE để bình luận của @ Konrad bên dưới:

Mã thông báo so sánh khó thực hiện hơn đặc biệt là vì bạn không thể dễ dàng vô hiệu hóa mã thông báo mà không lưu trữ chúng ở đâu đó.

er ... bạn đang xác nhận cookie ở phía máy chủ, phải không? Chỉ vì bạn đã nói với trình duyệt loại bỏ cookie sau 24 giờ không có nghĩa là nó sẽ như vậy. Cookie đó có thể được lưu bởi người dùng có kỹ thuật cao và được sử dụng lại rất lâu sau khi nó "hết hạn".

Nếu bạn không muốn lưu trữ dữ liệu phiên ở phía máy chủ, bạn nên lưu trữ nó trong mã thông báo (cookie hoặc cách khác). Mã thông báo auth tự chứa đôi khi được gọi là Macaroon. Làm thế nào điều này được truyền giữa máy khách và máy chủ (cho dù bằng cookie, như các tiêu đề bổ sung hoặc trong chính thực thể yêu cầu) hoàn toàn độc lập với chính cơ chế xác thực.


4
+1, tôi chắc chắn thích tính thực tế của việc sử dụng tiêu đề Ủy quyền nhưng "quay lại" với cookie tùy thuộc vào những gì hoạt động tốt nhất cho khách hàng.
Brandon Linton

Tôi không đồng ý với "Đối với khách hàng ngoài trình duyệt, quản lý cookie là một bất tiện khá lớn ...". Hầu hết các thư viện máy khách HTTP đều hỗ trợ cookie, ví dụ, với HttpClient.NET, bạn có thể sử dụng cookie mà không gặp vấn đề gì và bạn không thực sự cần phải suy nghĩ về nó. Mã thông báo so sánh khó thực hiện hơn đặc biệt là vì bạn không thể dễ dàng vô hiệu hóa mã thông báo mà không lưu trữ chúng ở đâu đó.
Konrad

1
@Konrad chỉ vì nó dễ dàng ở một số khách hàng không có trình duyệt không có nghĩa là nó dễ dàng trong tất cả chúng. Sẽ tốt thôi nếu bạn chỉ cần hỗ trợ ứng dụng khách cụ thể mà bạn tình cờ sử dụng, nhưng tôi đã giải thích câu hỏi là về API đối mặt công khai. trong curlhoặc wget, việc quản lý cookie khá bất tiện và bạn thực sự phải nghĩ về chúng một loạt. Tôi đã trả lời điểm khác của bạn bằng cách chỉnh sửa câu trả lời của tôi.
Độc thân Khuyến khích

Coi chừng việc chấp nhận cookie đơn giản sẽ mở ra các lỗ hổng CSRF. Xem thêm bảo
mật.stackexchange.com/a/166798

14

Có và Không - Phụ thuộc vào cách bạn sử dụng nó.

Cookies nếu được sử dụng để duy trì trạng thái máy khách tại máy khách, cho khách hàng, của khách hàng và bởi khách hàng thì họ sẽ yên tâm.

Nếu bạn đang lưu trữ trạng thái máy chủ vào cookie thì về cơ bản, bạn chỉ cần chuyển tải sang máy khách - không ổn định.

Vậy một số ví dụ là gì?

Yên tĩnh:

  • Chi tiết xác thực hoặc 'được đăng nhập'
  • trang hoặc nơi xem cuối cùng trong ứng dụng, vv

Không nghỉ ngơi:

  • Lưu trữ thông tin phiên

Sự yên tĩnh đến từ trạng thái không trạng thái - của máy chủ. Khách hàng có thể duy trì trạng thái ứng dụng và gửi nó đến máy chủ để nói họ đang ở đâu để máy chủ có thể quyết định nơi sẽ đi từ đó. Về cơ bản các phiên / trạng thái cần dữ liệu lịch sử và phụ thuộc vào các yêu cầu trong quá khứ, có thể nói, các ứng dụng yên tĩnh không lý tưởng (Không thể có ứng dụng hoàn toàn yên tĩnh 100% nếu bạn sắp có màn hình đăng nhập :)


10
Nếu bạn lưu trữ cờ "isLoggedIn" trên máy khách, bạn cũng có thể không sử dụng xác thực nào cả.
tdammers

Điều này chắc chắn có ý nghĩa - lưu trữ phía máy khách trạng thái ứng dụng sẽ không nhất quán với REST, nhưng thông tin máy khách mà nó sử dụng để thể hiện chính nó có vẻ ổn.
Brandon Linton

1
Tôi muốn thêm rằng việc đưa thông tin xác thực vào cookie sẽ mở ra khả năng các cuộc tấn công giả mạo yêu cầu trên nhiều trang web. Có nhiều cách tốt hơn, tôi khuyên bạn nên sao chép Amazon: docs.aws.amazon.com/AmazonS3/latest/API/ mẹo
Dobes Vandermeer

@tdammers thì sao nếu cờ "isLoggedIn" nằm trong JWT? Sau đó, điều đó nên được bảo mật, cung cấp JWT được ban hành và xác minh đúng.
Aaron J Spetner


12

Người ta có thể sử dụng cookie. REST cho phép họ.

REST yêu cầu bất kỳ thông tin phiên nào được lưu trữ ở phía máy khách, nhưng khi xác thực, một số thông tin phải ở lại phía máy chủ vì lý do bảo mật.

Từ một trong blog của tôi viết , có một thỏa thuận chung rằng dữ liệu xác thực được coi là ra khỏi phạm vi liên quan đến REST. Do đó, các máy chủ có thể giữ một số dữ liệu phiên này ở bên họ.

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.