跳至主要内容

📄 CORS

1. What is between JSONP and CORS ?

JSONP(JSON with Padding)和 CORS(跨來源資源共享)是兩種實現跨來源請求的技術,允許網頁從不同的域名(網站)請求資料。

JSONP

JSONP 是一種較為老舊的技術,用來解決早期的同源政策限制,允許網頁從不同的來源(域、協議或端口)請求數據。因為 <script> 標籤的載入不受同源政策限制,JSONP 通過動態添加 <script> 標籤並指向一個返回 JSON 數據的 URL 來工作。該 URL 的響應會包裹在一個函式調用中,網頁上的 JavaScript 會提前定義這個函式以接收數據。

// client-side
function receiveData(jsonData) {
console.log(jsonData);
}

let script = document.createElement('script');
script.src = 'http://example.com/data?callback=receiveData';
document.body.appendChild(script);
// server-side
receiveData({ name: 'PittWu', type: 'player' });

缺點是安全風險較高(因為可執行任意 JavaScript)且僅支援 GET 請求。

CORS

CORS 是一種比 JSONP 更安全、更現代的技術。它通過 HTTP 頭部 Access-Control-Allow-Origin 來告訴瀏覽器該請求是被允許的。伺服器設定相關的 CORS 頭部信息來決定哪些來源可以訪問它的資源。

假如 http://client.com 的前端想要訪問 http://api.example.com 的資源,api.example.com 需要在其響應中包含下列 HTTP header:

Access-Control-Allow-Origin: http://client.com

或者如果允許任何來源:

Access-Control-Allow-Origin: *

CORS 可以用於任何類型的 HTTP 請求,是一種標準化且安全的方式來執行跨來源請求。