Giao thức truyền siêu văn bản [HTTP] là một giao thức truyền thông mạng cho phép giao tiếp giữa các máy khách HTTP [trình duyệt hoặc ứng dụng di động] và máy chủ. HTTP dựa trên kiến trúc yêu cầu/phản hồi giữa máy khách và máy chủ. Ứng dụng khách gửi yêu cầu đến máy chủ và máy chủ xử lý yêu cầu của máy khách và gửi phản hồi lại cho máy khách. Mỗi thông báo HTTP bao gồm một chuỗi yêu cầu [dòng trạng thái để phản hồi], tiêu đề HTTP và nội dung thư
Yêu cầu NHẬN là gì?
Phương thức yêu cầu GET được sử dụng để truy xuất dữ liệu từ một URL được chỉ định. Phương thức HTTP GET là một trong chín phương thức yêu cầu Giao thức truyền siêu văn bản [HTTP] tiêu chuẩn. Yêu cầu GET chỉ nên nhận dữ liệu và không ảnh hưởng đến trạng thái của máy chủ
CORS là gì?
Chia sẻ tài nguyên nguồn gốc chéo [CORS] là một cơ chế bảo mật dựa trên các tiêu đề HTTP. CORS cho phép giao tiếp an toàn giữa các trình duyệt và máy chủ từ các nguồn khác nhau. CORS được tạo do các ràng buộc của chính sách gốc thống nhất, chính sách này hạn chế tài nguyên chỉ tương tác với các tài nguyên nằm trong cùng một miền
Ví dụ tiêu đề gốc
Origin: [URL]
Làm cách nào để thực hiện yêu cầu GET với Tiêu đề CORS?
Để thực hiện yêu cầu GET với các tiêu đề CORS, bạn cần gửi yêu cầu TÙY CHỌN 'preflight' tới máy chủ và kiểm tra xem máy chủ có thể cung cấp các tiêu đề HTTP được yêu cầu hay không. Nếu yêu cầu của bạn được máy chủ chấp nhận, nó sẽ phản hồi bằng mã trạng thái 200, bao gồm tiêu đề Access-Control-Allow-Origin với tên miền của bạn và tiêu đề Access-Control-Allow-Headers chứa các tiêu đề HTTP bắt buộc. Sau đó, bạn có thể gửi yêu cầu GET sau để lấy thông tin cần thiết
TÙY CHỌN Yêu cầu với tiêu đề CORS
OPTIONS /echo/get/json HTTP/1.1
Host: reqbin.com
Origin: //example.reqbin.com
Access-Control-Request-Headers: Content-Type
Phản hồi của máy chủ đối với yêu cầu TÙY CHỌN của chúng tôi thông báo rằng khách hàng có thể gửi yêu cầu GET với các tiêu đề CORS
Phản hồi của máy chủ đối với yêu cầu TÙY CHỌN
HTTP/1.1 200 OK
Access-Control-Allow-Origin: //example.reqbin.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type
Xem thêm
- Làm cách nào để yêu cầu JSON từ máy chủ?
- Làm cách nào để đăng Dữ liệu Biểu mẫu HTML lên Máy chủ?
- Làm cách nào tôi có thể gửi yêu cầu CORS bằng Curl?
- Làm cách nào để gửi Yêu cầu NHẬN với Tiêu đề ủy quyền mã thông báo Bearer?
Chia sẻ tài nguyên trên nhiều nguồn gốc [CORS] là một tính năng bảo mật của trình duyệt nhằm hạn chế các yêu cầu HTTP trên nhiều nguồn gốc được bắt đầu từ các tập lệnh đang chạy trong trình duyệt. Nếu tài nguyên API REST của bạn nhận được các yêu cầu HTTP có nguồn gốc chéo không đơn giản, bạn cần bật hỗ trợ CORS
Xác định xem có bật hỗ trợ CORS hay không
Yêu cầu HTTP có nguồn gốc chéo là yêu cầu được thực hiện để
Một miền khác [ví dụ: từ
8 đếnOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
9]OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Một miền phụ khác [ví dụ: từ
8 đếnOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
1]HTTP/1.1 200 OK Access-Control-Allow-Origin: //example.reqbin.com Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type
Một cổng khác [ví dụ: từ
8 đếnOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
3]HTTP/1.1 200 OK Access-Control-Allow-Origin: //example.reqbin.com Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type
Một giao thức khác [ví dụ: từ
4 đếnHTTP/1.1 200 OK Access-Control-Allow-Origin: //example.reqbin.com Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type
5]HTTP/1.1 200 OK Access-Control-Allow-Origin: //example.reqbin.com Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type
Các yêu cầu HTTP có nguồn gốc chéo có thể được chia thành hai loại. yêu cầu đơn giản và yêu cầu không đơn giản
Yêu cầu HTTP là đơn giản nếu tất cả các điều kiện sau đều đúng
Nó được phát hành đối với tài nguyên API chỉ cho phép các yêu cầu
0,import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
1 vàimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
2import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Nếu đó là yêu cầu phương thức
2, nó phải bao gồm tiêu đềimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
4import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Loại nội dung tải trọng yêu cầu là
5,import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
6 hoặcimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
7import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Yêu cầu không chứa tiêu đề tùy chỉnh
Bất kỳ yêu cầu bổ sung nào được liệt kê trong
Đối với các yêu cầu phương thức
2 có nguồn gốc chéo đơn giản, phản hồi từ tài nguyên của bạn cần bao gồm tiêu đềimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
9, trong đó giá trị của khóa tiêu đề được đặt thànhimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
80[bất kỳ nguồn gốc nào] hoặc được đặt thành nguồn gốc được phép truy cập vào tài nguyên đóOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Tất cả các yêu cầu HTTP có nguồn gốc chéo khác là các yêu cầu không đơn giản. Nếu tài nguyên API của bạn nhận được các yêu cầu không đơn giản, bạn cần bật hỗ trợ CORS
Ý nghĩa của việc kích hoạt hỗ trợ CORS
Khi trình duyệt nhận được yêu cầu HTTP không đơn giản, trình duyệt sẽ yêu cầu trình duyệt gửi yêu cầu chạy trước đến máy chủ và chờ phê duyệt [hoặc yêu cầu thông tin xác thực] từ máy chủ trước khi gửi yêu cầu thực tế. Yêu cầu chiếu trước xuất hiện với API của bạn dưới dạng yêu cầu HTTP
Bao gồm một tiêu đề
4import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Sử dụng phương pháp
82OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Bao gồm các tiêu đề sau
83OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
84OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Do đó, để hỗ trợ CORS, tài nguyên API REST cần triển khai phương thức
82 có thể đáp ứng yêu cầu chiếu trước củaOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
82 với ít nhất các tiêu đề phản hồi sau theo tiêu chuẩn Tìm nạpOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
87OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
88OPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
9import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
Cách bạn bật hỗ trợ CORS tùy thuộc vào loại tích hợp API của bạn
Kích hoạt hỗ trợ CORS cho tích hợp giả
Để tích hợp giả, bạn kích hoạt CORS bằng cách tạo một phương thức
82 để trả về các tiêu đề phản hồi được yêu cầu [với các giá trị tĩnh thích hợp] làm tiêu đề phản hồi của phương thức. Ngoài ra, mỗi phương thức kích hoạt CORS thực tế cũng phải trả về tiêu đềOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
91' trong ít nhất 200 phản hồi của nó, trong đó giá trị của khóa tiêu đề được đặt thànhOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
80 [bất kỳ nguồn gốc nào] hoặc được đặt thành nguồn gốc được phép truy cập vàoOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Kích hoạt hỗ trợ CORS cho tích hợp không có proxy của Lambda hoặc HTTP và tích hợp dịch vụ AWS
Đối với tích hợp tùy chỉnh Lambda [không phải proxy], tích hợp tùy chỉnh HTTP [không phải proxy] hoặc tích hợp dịch vụ AWS, bạn có thể thiết lập các tiêu đề bắt buộc bằng cách sử dụng cài đặt phản hồi tích hợp và phản hồi của phương thức API Gateway. Khi bạn bật CORS bằng cách sử dụng Bảng điều khiển quản lý AWS, API Gateway sẽ tạo một phương thức
82 và cố gắng thêm tiêu đềOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
9 vào phản hồi tích hợp phương thức hiện có của bạn. Điều này không phải lúc nào cũng hoạt động và đôi khi bạn cần sửa đổi phản hồi tích hợp theo cách thủ công để kích hoạt CORS đúng cách. Thông thường, điều này chỉ có nghĩa là sửa đổi phản hồi tích hợp theo cách thủ công để trả về tiêu đềimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
9import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Bật hỗ trợ CORS cho tích hợp proxy Lambda hoặc HTTP
Đối với tích hợp proxy Lambda hoặc tích hợp proxy HTTP, bạn vẫn có thể thiết lập tiêu đề phản hồi
82 bắt buộc trong Cổng API. Tuy nhiên, chương trình phụ trợ của bạn chịu trách nhiệm trả về các tiêu đềOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
9 vàimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
88 vì tích hợp proxy không trả về phản hồi tích hợpOPTIONS /echo/get/json HTTP/1.1 Host: reqbin.com Origin: //example.reqbin.com Access-Control-Request-Headers: Content-Type
Tiêu đề nào là cần thiết cho CORS?
Triển khai chia sẻ tài nguyên trên nhiều nguồn gốc đơn giản . Tiêu đề này được máy chủ trả về khi một trang web yêu cầu tài nguyên tên miền chéo, với tiêu đề Gốc do trình duyệt thêm vào. Access-Control-Allow-Origin is the most significant. This header is returned by a server when a website requests a cross-domain resource, with an Origin header added by the browser.Tiêu đề phản hồi CORS là gì?
Tiêu đề phản hồi được liệt kê trong danh sách an toàn CORS là tiêu đề HTTP trong phản hồi CORS được coi là an toàn để hiển thị cho các tập lệnh máy khách . Chỉ các tiêu đề phản hồi được liệt kê trong danh sách an toàn mới được cung cấp cho các trang web. Theo mặc định, danh sách an toàn bao gồm các tiêu đề phản hồi sau. Kiểm soát bộ đệm. Nội dung-Ngôn ngữ.Làm cách nào để cho phép CORS trong JavaScript?
Thêm tiêu đề CORS vào ứng dụng . const express = require["express"]; . env. SERVER_PORT. 3001; . // enable-cors. tổ chức/server_expressjs. ứng dụng html. - see //enable-cors.org/server_expressjs.html app.Làm cách nào để đặt tiêu đề gốc trong javascript?
Tóm lại. bạn không thể . Như được mô tả trên MDN; .