# Chia sẻ liên miền

## Chia sẻ liên miền là gì
Chia sẻ tài nguyên chéo nguồn (CORS - Cross-Origin Resource Sharing) là một cơ chế sử dụng các header HTTP bổ sung để thông báo cho trình duyệt cho phép một ứng dụng Web đang chạy ở một tên miền này được phép truy cập các tài nguyên được chỉ định từ một máy chủ của tên miền khác.
Khi một tài nguyên yêu cầu một tài nguyên khác từ một tên miền, giao thức hoặc cổng khác với máy chủ nơi chính tài nguyên đó tọa lạc, tài nguyên đó sẽ khởi tạo một yêu cầu HTTP liên miền (cross-domain).
Vì lý do bảo mật, các trình duyệt hạn chế các yêu cầu HTTP liên miền được khởi tạo từ bên trong các tập lệnh (script). Ví dụ: XMLHttpRequest và Fetch.
API tuân theo chính sách cùng nguồn gốc (same-origin policy), nghĩa là các ứng dụng Web sử dụng các API này chỉ có thể yêu cầu các tài nguyên HTTP từ cùng một tên miền tải ứng dụng đó, trừ khi thông báo phản hồi chứa header phản hồi CORS chính xác.


## Yêu cầu đơn giản và Yêu cầu không đơn giản
Đối với các yêu cầu HTTP liên miền, trình duyệt sẽ xác định xem yêu cầu đó có phải là yêu cầu liên miền đơn giản hay không dựa trên cấu trúc trong API gửi đi. Một yêu cầu liên miền không đơn giản sẽ gửi một yêu cầu kiểm tra trước (pre-flight) với phương thức OPTIONS. Các yêu cầu đáp ứng các điều kiện sau đây được coi là yêu cầu đơn giản:

* Sử dụng một trong các phương thức sau:
    * GET
    * HEAD
    * POST
* Chỉ có thể bao gồm các HTTP header sau:
    * Accept
    * Accept-Language
    * Content-Language
    * Content-Type (lưu ý các hạn chế bổ sung)
    * DPR
    * Downlink
    * Save-Data
    * Viewport-Width
    * Width 
* Giá trị của Content-Type bị giới hạn trong một trong ba giá trị sau:
    * text/plain
    * multipart/form-data
    * application/x-www-form-urlencoded  
* Không có đối tượng XMLHttpRequestUpload nào trong yêu cầu đăng ký bất kỳ trình lắng nghe sự kiện (event listener) nào; các đối tượng XMLHttpRequestUpload có thể được truy cập bằng thuộc tính XMLHttpRequest.upload.
* Không có đối tượng ReadableStream nào được sử dụng trong yêu cầu.
 
 
 ## Hỗ trợ CORS của APIGateway
 Đối với các API đã liên kết với chính sách liên miền CORS, APIGateway sẽ quyết định có thêm header phản hồi CORS hay không dựa trên nội dung phản hồi từ backend. Nếu backend không có bất kỳ header phản hồi CORS nào, APIGateway sẽ thêm các header phản hồi sau:
 ```
 Access-Control-Allow-Origin : $http_origin
 Access-Control-Allow-Header : X-Gw-Signature-Method,X-Gw-Signature-Headers,X-Gw-Signature-Headers,X-Gw-Timestamp,X-Gw-Timestamp,X-Gw-SignedString,X-Gw-Stage,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range
 Access-Control-Allow-Method : POST,GET,DELETE,OPTIONS,HEAD,PUT
 Access-Control-Expose-Header : X-Gw-Signature-Method,X-Gw-Signature-Headers,X-Gw-Signature-Headers,X-Gw-Timestamp,X-Gw-Timestamp,X-Gw-SignedString,X-Gw-Stage,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range
 Access-Control-Allow-CREDENTIALS: true   
 ```
 <br/>
 Đối với các yêu cầu trả về bất kỳ header phản hồi nào trong header CORS, chúng tôi coi đó là người dùng muốn tự xử lý header phản hồi CORS và APIGateway sẽ không thực hiện bất kỳ xử lý nào đối với các header phản hồi CORS đó.