「X-Frame-Options、Same-origin policy、Cross-Origin Resource Sharing」相關筆記

原始問題

作品中插入 Linkedin、Facebook 與 Instagram 的超連結,為什麼在 codepen 右側欄位中點選這些超連結無法前往該網站?

在codepen的輸出視窗點擊超連結,無法連線至該網站

簡答

根據 DevTool Console 顯示的錯誤訊息,codepen.io 將X-Frame-Options設定為sameorigin,故無法在 codepen.io 的<iframe>中開啟不同來源(origin)的網站(Linkedin、Facebook 或 Instagram)

環境

Google Chrome: 89.0.4389.114 (Official Build) (64-bit)
os: Windows_NT 10.0.18363 win32 x64

X-Frame-Options

問題解析

定義 Same-origin policy

定義 origin

筆記

例外

參考MDN: Cross-origin network access

定義 Cross-Origin Resource Sharing (CORS)

處理方式

流程如下:

  1. 設定 server 的 HTTP response headers 來讓瀏覽器知道可以執行 CORS
var express = require('express');
var cors = require('cors');
var app = express();

app.use(cors()); // 讓server允許CORS

app.get('/products/:id', function (req, res, next) {
  res.json({ msg: 'This is CORS-enabled for all origins!' });
});

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80');
});
  1. 透過瀏覽器發出 request 的時候,header 需包含Origin資訊
  1. server 收到包含Origin資訊的 header、並 server 本身允許 CORS 時,server 發出的 response header 就會包含Access-Control-Allow-Origin的 key-value pair;*代表允許來自任何 URL 的 CORS,或是字串(僅允許特定 URL 進行 CORS)
  2. 瀏覽器收到 response header,並Access-Control-Allow-Origin的值允許客戶端 CORS 的話,就會將 server 回覆的內容提供給客戶端

參考文件