2019年1月24日 星期四

Cross-Origin Resource Sharing

Origin

兩個 URI 被視為同源(Same Origin)的條件是,它們必須要有相同的 scheme、host 和 port。

  1. 不直接使用 Host 的原因是在於需要有 scheme 被包含在內,也就是 HTTP 和 HTTPS 要被視為不同源,例如 http://example.comhttps://example.com 是不同源的 URI。
  2. 使用 fully qualified host name 而不使用 top level domain 的原因,是在於在現實中常發生 domain 本身實際屬於多個不同擁有者的狀況。例如學校會給予學生網頁空間,所以學生可以把網頁部屬在 https://example.edu/~student/,但這並不表示學生的網頁就應該要跟學校的網頁像是 https://grades.example.edu/ 同源。換句話說,在這種狀況下學校不一定信任學生的網頁。

所以說,底下的這幾個 URI 都是同源的,因為他們的 scheme、host 和 port 都相同:

但換成這些 URI 則都是不同源的:

跨來源請求

當瀏覽器要發送跨來源請求的時候,瀏覽器會先自動送出一個 OPTIONS request(或者稱為 preflight request),上面夾帶了自己的 Origin,用來確認伺服器端允許自己做哪些事。如果說要存取的是比較複雜的 method 的話,伺服器端有可能回覆像是這樣的內容:

Access-Control-Allow-Origin: http://hello-world.example
Access-Control-Max-Age: 3628800
Access-Control-Allow-Methods: PUT, DELETE

這段內容中,Access-Control-Allow-Origin 表示允許 http://hello-world.example 這個 URI 使用回覆的內容;Access-Control-Max-Age 表示這個 OPTIONS 的效力有多久,換句話說,就是瀏覽器多久之內不需要再送一次 OPTIONS 來確認允許的範圍;Access-Control-Allow-Methods 則表示瀏覽器在實際發送請求的時候,允許使用 PUT 和 DELETE 兩種 method。

參考資料
  1. 輕鬆理解 Ajax 與跨來源請求
  2. RFC 6454
  3. Cross-Origin Resource Sharing
  4. 跨來源資源共用(CORS)
  5. Spring Security – 20. CORS

沒有留言: