What is the Access-Control-Allow-Origin Response Header?

Header Access-Control-Allow-Origin có trong response của request đến từ một cross-origin website và là một trong các header được sử dụng để triển khai CORS.

Implementing Simple Cross-origin Resource Sharing

Trình duyệt sẽ so khớp giá trị của Access-Control-Allow-Origin trong response với origin của website gửi request nhằm cho quyết định xem có cho phép website đó truy cập vào response hay không.

Ví dụ, giả sử origin https://normal-website.com gửi một cross-origin request như sau:

GET /data HTTP/1.1
Host: robust-website.com
Origin : https://normal-website.com

Server ở origin robust-website.com trả về response có dạng như sau:

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://normal-website.com

Trình duyệt thấy giá trị của header Access-Control-Allow-Origin khớp với origin gửi request nên cho phép code JavaScript trên origin này truy cập vào response.

Có thể chỉ định nhiều origin với header Access-Control-Allow-Origin hoặc wildcard (*). Tuy nhiên, không có trình duyệt nào hỗ trợ nhiều origin và có nhiều hạn chế trong việc sử dụng wildcard.

Handling Cross-origin Resource Requests with Credentials

Cross-origin server có thể cho phép đọc response trong trường hợp có credientials gửi lên bằng cách set header Access-Control-Allow-Credentials trong response thành true.

Ví dụ, nếu website gửi cross-origin request có đính kèm cookie:

GET /data HTTP/1.1
Host: robust-website.com
...
Origin: https://normal-website.com
Cookie: JSESSIONID=<value>

Và response từ server là:

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://normal-website.com
Access-Control-Allow-Credentials: true

Thì trình duyệt sẽ cho website gửi request được đọc response do header Access-Control-Allow-Credentials có giá trị là true.

Relaxation of CORS Specifications with Wildcards

Header Access-Control-Allow-Origin hỗ trợ giá trị wildcard. Ví dụ:

Access-Control-Allow-Origin: *

Note

Giá trị wildcard không được sử dụng trong các giá trị nào khác. Ví dụ, header sau là không hợp lệ:

Access-Control-Allow-Origin: https://*.normal-website.com

Việc sử dụng wildcard cho các cross-origin request có gửi kèm credentials (authentication, cookies hoặc client-side certificates) là bị cấm.

Cụ thể, request mà có 2 header như bên dưới sẽ không được phép:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Pre-flight Checks

Pre-flight check được thêm vào đặc tả của CORS để bảo vệ các tài nguyên cũ khỏi các request sử dụng các option mở rộng của CORS.

Trong một số trường hợp nhất định, khi một cross-origin request chứa một HTTP method hoặc các header không chuẩn thì sẽ có một request với method là OPTIONS được gửi đi trước cross-origin request. Request này sẽ giúp kiểm tra các method và header được sử dụng trong cross-origin request. Đây được gọi là pre-flight check.

Ví dụ, pre-flight request giúp kiểm tra method PUT và header Special-Request-Header có thể có dạng như sau:

OPTIONS /data HTTP/1.1
Host: <some website>
...
Origin: https://normal-website.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Special-Request-Header

Server khi nhận được pre-flight request thì sẽ phản hồi lại cho trình duyệt một tập các method và header được phép:

HTTP/1.1 204 No Content
...
Access-Control-Allow-Origin: https://normal-website.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
Access-Control-Allow-Headers: Special-Request-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240

Header Access-Control-Max-Age giúp chỉ định số giây tối đa mà response của pre-flight request được lưu ở trong cache nhằm phục vụ cho mục đích dùng lại.

list
from outgoing([[Port Swigger - Access-Control-Allow-Origin Response Header]])
sort file.ctime asc

Resources