Chia sẻ tài nguyên giữa các nguồn gốc khác nhau là gì?

Chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) là một cơ chế để tích hợp ứng dụng. CORS tạo ra một phương thức cho phép các ứng dụng web máy khách được tải trong một miền để tương tác với tài nguyên trong miền khác. Cơ chế này rất hữu ích vì các ứng dụng phức tạp thường tham chiếu API và tài nguyên của bên thứ ba trong mã phía máy khách của chúng. Ví dụ: ứng dụng của bạn có thể sử dụng trình duyệt để kéo video từ API của nền tảng video, sử dụng phông chữ từ thư viện phông chữ công cộng hoặc hiển thị dữ liệu thời tiết từ cơ sở dữ liệu thời tiết quốc gia. CORS cho phép trình duyệt máy khách kiểm tra với máy chủ bên thứ ba xem yêu cầu có được ủy quyền hay không trước khi thực hiện bất kỳ hoạt động truyền dữ liệu nào.

Tại sao chia sẻ tài nguyên giữa các nguồn gốc khác nhau lại quan trọng?

Trước đây, khi công nghệ Internet vẫn còn mới, các vấn đề về giả mạo yêu cầu liên trang web (CSRF) đã xảy ra. Những vấn đề này diễn ra bằng cách gửi các yêu cầu máy khách giả mạo từ trình duyệt của nạn nhân đến một ứng dụng khác.

Ví dụ: nạn nhân đăng nhập vào ứng dụng ngân hàng của họ. Sau đó, họ bị lừa tải một trang web bên ngoài trên một tab trình duyệt mới. Tiếp theo, trang web bên ngoài sử dụng thông tin chứng thực cookie của nạn nhân và chuyển tiếp dữ liệu đến ứng dụng ngân hàng trong khi giả vờ là nạn nhân. Người dùng trái phép sau đó có quyền truy cập ngoài ý muốn vào ứng dụng ngân hàng.

Để ngăn chặn các vấn đề CSRF như vậy, tất cả các trình duyệt ngày nay triển khai chính sách cùng nguồn gốc.

Chính sách cùng nguồn gốc

Ngày nay, các trình duyệt buộc máy khách chỉ có thể gửi các yêu cầu đến một tài nguyên có cùng nguồn gốc với URL của khách hàng. Giao thức, cổng và tên máy chủ của URL máy khách phải khớp với máy chủ mà nó yêu cầu.

Ví dụ: hãy xem xét sự so sánh nguồn gốc giữa các URL dưới đây với URL máy khách http://store.aws.com/dir/page.html.

URL

Kết quả

Lý do

http://store.aws.com/dir2/new.html

Cùng nguồn gốc

Chỉ khác đường dẫn

http://store.aws.com/dir/inner/other.html        

Cùng nguồn gốc

Chỉ khác đường dẫn

https://store.aws.com/page.html

Nguồn gốc khác      

Giao thức khác

http://store.aws.com:81/dir/page.html

Nguồn gốc khác

Cổng khác (http:// là cổng 80 theo mặc định)

http://news.aws.com/dir/page.html

Nguồn gốc khác

Máy chủ khác

Vì vậy, chính sách cùng nguồn gốc có tính bảo mật cao nhưng lại thiếu linh hoạt trong các trường hợp sử dụng thực tế.

Chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) là phần mở rộng của chính sách cùng nguồn gốc. Bạn cần cơ chế này để ủy quyền chia sẻ tài nguyên với bên thứ ba bên ngoài. Ví dụ: bạn cần CORS khi muốn kéo dữ liệu từ các API bên ngoài được ủy quyền hoặc công khai. Bạn cũng cần CORS nếu muốn cho phép bên thứ ba được ủy quyền truy cập vào tài nguyên máy chủ của riêng bạn.

Chia sẻ tài nguyên giữa các nguồn gốc khác nhau hoạt động như thế nào?

Trong giao tiếp Internet tiêu chuẩn, trình duyệt của bạn gửi một yêu cầu HTTP đến máy chủ ứng dụng, nhận dữ liệu dưới dạng phản hồi HTTP và hiển thị dữ liệu đó. Trong thuật ngữ trình duyệt, URL của trình duyệt hiện tại được gọi là nguồn gốc hiện tại, còn URL của bên thứ ba là nguồn gốc khác.

Khi bạn thực hiện một yêu cầu giữa các nguồn gốc khác nhau, quy trình yêu cầu-phản hồi sẽ diễn ra như sau:

  1. Trình duyệt sẽ thêm một tiêu đề nguồn gốc vào yêu cầu với thông tin về giao thức, máy chủ và cổng của nguồn gốc hiện tại
  2. Máy chủ kiểm tra tiêu đề của nguồn gốc hiện tại và phản hồi với dữ liệu được yêu cầu và một tiêu đề Access-Control-Allow-Origin
  3. Trình duyệt sẽ thấy được các tiêu đề yêu cầu kiểm soát truy cập và chia sẻ dữ liệu trả về với ứng dụng máy khách

Ngoài ra, nếu máy chủ không muốn cho phép truy cập giữa các nguồn gốc khác nhau, máy chủ sẽ phản hồi bằng một thông báo lỗi.

Ví dụ về chia sẻ tài nguyên giữa các nguồn gốc khác nhau

Ví dụ: hãy xem xét một trang web được gọi là https://news.example.com. Trang web này muốn truy cập tài nguyên từ một API tại partner-api.com.

Trước tiên, các nhà phát triển tại https://partner-api.com sẽ cấu hình những tiêu đề chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) trên máy chủ của họ bằng cách thêm new.example.com vào danh sách nguồn gốc được cho phép. Để làm điều này, họ thêm dòng bên dưới vào tệp cấu hình máy chủ của họ.

Access-Control-Allow-Origin: https://news.example.com

Sau khi truy cập CORS được cấu hình, news.example.com có thể yêu cầu tài nguyên từ partner-api.com. Đối với mỗi yêu cầu, partner-api.com sẽ phản hồi bằng Access-Control-Allow-Credentials : "true." Sau đó, trình duyệt biết rằng thao tác giao tiếp được ủy quyền và cho phép truy cập giữa các nguồn gốc khác nhau.

Nếu bạn muốn cấp quyền truy cập vào nhiều nguồn gốc, hãy sử dụng danh sách phân tách bằng dấu phẩy hoặc ký tự đại diện như * để cấp quyền truy cập cho tất cả mọi người.

Yêu cầu trước khi gửi đi CORS là gì?

Trong HTTP, phương thức yêu cầu là các thao tác dữ liệu mà máy khách muốn máy chủ thực hiện. Các phương thức HTTP phổ biến bao gồm GET, POST, PUTDELETE.

Trong tương tác chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) thông thường, trình duyệt sẽ gửi cùng lúc yêu cầu và các tiêu đề kiểm soát truy cập. Đây thường là yêu cầu dữ liệu GET và được coi là có mức độ rủi ro thấp.

Tuy nhiên, một số yêu cầu HTTP được coi là phức tạp và cần được máy chủ xác nhận trước khi gửi đi yêu cầu thực tế. Quá trình phê duyệt trước được gọi là yêu cầu trước khi gửi đi.

Yêu cầu giữa các nguồn gốc khác nhau phức tạp

Yêu cầu giữa các nguồn gốc khác nhau sẽ phức tạp nếu chúng sử dụng bất kỳ yếu tố nào sau đây:

  • Phương thức khác ngoài GET, POST, hoặc HEAD
  • Tiêu đề khác ngoài Accept-Language, Accept hoặc Content-Language
  • Tiêu đề Content-Type khác ngoài multipart/form-data, application/x-www-form-urlencoded hoặc text/plain

Do vậy, ví dụ như các yêu cầu xóa hoặc sửa đổi dữ liệu hiện có được coi là phức tạp.

Cách thức hoạt động của yêu cầu trước khi gửi đi

Trình duyệt tạo các yêu cầu trước khi gửi đi nếu cần thiết. Đây là một yêu cầu OPTIONS giống như sau.

OPTIONS /data HTTP/1.1

Nguồn gốc: https://example.com

Access-Control-Request-Method: DELETE

Trình duyệt sẽ gửi yêu cầu trước khi gửi đi trước thông báo về yêu cầu thực tế. Máy chủ phải phản hồi yêu cầu trước khi gửi đi với thông tin về những yêu cầu giữa các nguồn gốc khác nhau mà máy chủ sẵn sàng chấp nhận từ URL máy khách. Tiêu đề phản hồi của máy chủ phải bao gồm những yếu tố sau:

  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Origin

Dưới đây là một ví dụ về phản hồi của máy chủ.

HTTP/1.1 200 OK

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Origin: https://news.example.com

Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS

Phản hồi đối với yêu cầu trước khi gửi đi đôi khi bao gồm thêm tiêu đề Access-Control-Max-Age. Chỉ số này xác định thời lượng (tính bằng giây) cho trình duyệt để lưu kết quả của yêu cầu trước khi gửi đi vào bộ nhớ đệm trong trình duyệt. Lưu bộ nhớ đệm cho phép trình duyệt gửi nhiều yêu cầu phức tạp giữa các yêu cầu trước khi gửi đi. Trình duyệt không phải gửi một yêu cầu trước khi gửi đi khác cho đến khi thời gian được chỉ định bởi max-age kết thúc.

 

Điểm khác biệt giữa CORS và JSONP là gì?

JSON có khoảng đệm (JSONP) là một kỹ thuật lịch sử cho phép giao tiếp giữa các ứng dụng web chạy trên các miền khác nhau.

Với JSONP, bạn sử dụng các thẻ tập lệnh HTML trong trang máy khách. Thẻ tập lệnh tải các tệp JavaScript bên ngoài hoặc nhúng mã JavaScript trực tiếp trong trang HTML. Vì các tập lệnh không phải tuân theo chính sách cùng nguồn gốc, bạn có thể truy xuất dữ liệu giữa các nguồn gốc khác nhau thông qua mã JavaScript.

Tuy nhiên, dữ liệu phải ở định dạng JSON. Ngoài ra, JSONP có tính bảo mật kém hơn so với chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) vì JSONP dựa vào độ tin cậy của miền bên ngoài để cung cấp dữ liệu an toàn.

Các trình duyệt hiện đại đã thêm một số tính năng bảo mật, vậy nên mã cũ chứa JSONP sẽ không còn hoạt động với chúng nữa. CORS hiện là tiêu chuẩn web toàn cầu cho hoạt động kiểm soát truy cập giữa các nguồn gốc khác nhau.

Tìm hiểu về JavaScript »

Tìm hiểu về JSON »

Một số biện pháp thực hành tốt nhất với CORS là gì?

Bạn nên lưu ý những điều sau khi cấu hình chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS) trên máy chủ của bạn.

Xác định danh sách truy cập thích hợp

Tốt nhất là luôn cấp quyền truy cập cho các miền riêng lẻ bằng cách sử dụng danh sách phân tách bằng dấu phẩy. Tránh sử dụng ký tự đại diện trừ khi bạn muốn công khai API. Nếu không, việc sử dụng ký tự đại diện và biểu thức chính quy có thể tạo ra các lỗ hổng bảo mật.

Ví dụ: giả sử bạn viết một biểu thức chính quy cấp quyền truy cập vào tất cả các trang web có hậu tố permitted-website.com. Chỉ với một biểu thức, bạn cấp quyền truy cập vào api.permitted-website.comnews.permitted-website.com. Nhưng bạn cũng vô tình cấp quyền truy cập vào các trang web trái phép có thể sử dụng các miền như maliciouspermitted-website.com.

Tránh sử dụng nguồn gốc có giá trị null trong danh sách của bạn

Một số trình duyệt gửi giá trị null trong tiêu đề yêu cầu cho một số tình huống như yêu cầu tệp hoặc yêu cầu từ máy chủ cục bộ.

Tuy nhiên, bạn không nên bao gồm giá trị null trong danh sách truy cập của mình. Điều này cũng gây ra các rủi ro bảo mật vì những yêu cầu trái phép chứa các tiêu đề null có thể được cấp quyền truy cập.

AWS có thể hỗ trợ các yêu cầu CORS của bạn như thế nào?

Nhiều dịch vụ của chúng tôi có tích hợp sẵn hỗ trợ chia sẻ tài nguyên giữa các nguồn gốc khác nhau (CORS). Vì vậy, bạn có thể kiểm soát quyền truy cập giữa các nguồn gốc khác nhau vào API và tài nguyên được lưu trữ trên Amazon Web Services (AWS).

Dưới đây là một số dịch vụ AWS có hỗ trợ CORS:

  • Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) là dịch vụ lưu trữ đối tượng có các lớp lưu trữ tiết kiệm chi phí cho tất cả các trường hợp sử dụng lưu trữ dữ liệu. Amazon S3 cho phép bạn tạo tài liệu cấu hình CORS với các quy tắc xác định những nguồn gốc mà bạn sẽ cho phép truy cập vào dữ liệu S3 của mình, các thao tác (phương thức HTTP) mà bạn sẽ hỗ trợ cho từng nguồn gốc và những thông tin cụ thể khác về thao tác. Bạn có thể thêm tối đa 100 quy tắc vào cấu hình.
  • Cổng API Amazon là dịch vụ được quản lý toàn phần giúp bạn dễ dàng tạo, phát hành, duy trì, giám sát và bảo mật API ở mọi quy mô. Bạn có thể bật CORS cho các API REST của mình chỉ với một cú nhấp chuột trực tiếp trong bảng điều khiển Cổng API Amazon.

Bắt đầu sử dụng API trên AWS bằng cách tạo tài khoản ngay hôm nay.

Các bước tiếp theo trên AWS

Tham khảo các tài nguyên bổ sung liên quan đến sản phẩm
Tham khảo các dịch vụ Tích hợp ứng dụng 
Đăng ký tài khoản miễn phí

Nhận ngay quyền sử dụng Bậc miễn phí của AWS.

Đăng ký 
Bắt đầu xây dựng trong bảng điều khiển

Bắt đầu xây dựng trong AWS Management Console.

Đăng nhập