Origin
兩個 URI 被視為同源(Same Origin)的條件是,它們必須要有相同的 scheme、host 和 port。
- 不直接使用 Host 的原因是在於需要有 scheme 被包含在內,也就是 HTTP 和 HTTPS 要被視為不同源,例如 http://example.com 和 https://example.com 是不同源的 URI。
- 使用 fully qualified host name 而不使用 top level domain 的原因,是在於在現實中常發生 domain 本身實際屬於多個不同擁有者的狀況。例如學校會給予學生網頁空間,所以學生可以把網頁部屬在 https://example.edu/~student/,但這並不表示學生的網頁就應該要跟學校的網頁像是 https://grades.example.edu/ 同源。換句話說,在這種狀況下學校不一定信任學生的網頁。
所以說,底下的這幾個 URI 都是同源的,因為他們的 scheme、host 和 port 都相同:
但換成這些 URI 則都是不同源的:
- http://example.com/
- http://example.com:8080/
- http://www.example.com/
- https://example.com:80/
- https://example.com/
- http://example.org/
- http://ietf.org/
跨來源請求
當瀏覽器要發送跨來源請求的時候,瀏覽器會先自動送出一個 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。
沒有留言:
張貼留言