HTTP請求中的referrer和Referrer-Policy
什么是referrer
當一個用戶點擊當前頁面中的一個鏈接,然后跳轉到目標頁面時,目標頁面會收到一個信息,即用戶是從哪個源鏈接跳轉過來的。
使用場景
需要控制這個referrer字段的值,即是否讓其顯示在請求頭中,或者是否顯示完整路徑等。尤其是在以下兩個使用場景:
隱私
在社交網站的個人中心頁面,也許會存在一些外鏈,這時候社交網站肯定不希望用戶在點擊這些鏈接跳轉到其他第三方網站時會將自己個人中心的URL信息顯示在referrer字段中傳過去,尤其是個人中心頁面的URL往往會帶着用戶數據和一些敏感信息。這時候可以選擇不顯示來源頁面URL信息或者只顯示一個網站根地址hostname。
安全
有些使用了https的網站,可能在URL中使用一個參數(sid)來作為用戶身份憑證,而又需要引入其他https網站的資源,這種情況,網站肯定不希望泄露用戶的身份憑證信息。當https網站需要引入不安全的http網站的資源或者有鏈接要跳轉到http網站時,這時候將https源網站的URL信息傳過去也是不太安全的。
當然還有其他情況下需要referrer的值,比如最近公司所做的項目中,有一個請求由於請求頭過大導致響應是400,我們的Referrer Policy是默認的情況,顯示的referrer是完整的URL信息,該URL帶了很多敏感數據比如加密后的token,sessionID等,長度特別長,請求頭中的cookie和請求的URL也帶着很大塊的信息,最終我們決定讓referrer只攜帶網站根地址的信息而不是其完整路徑,由此減小了header的大小。
Referrer-Policy
Referrer-Policy的作用就是為了控制請求頭中referrer的內容,目前是一個候選標准,不過已經有部分瀏覽器支持該標准。
目前Referrer-Policy只包含以下幾種值:
enum ReferrerPolicy {
"", // 若設為空串則默認按照瀏覽器的機制設置referrer的內容,默認情況下是和no-referrer-when-downgrade設置得一樣。
"no-referrer", // 不顯示referrer的任何信息在請求頭中。
"no-referrer-when-downgrade", // 這是默認值。當從https網站跳轉到http網站或者請求其資源時(安全降級HTTPS→HTTP),不顯示referrer的信息,其他情況(安全同級HTTPS→HTTPS,或者HTTP→HTTP)則在referrer中顯示完整的源網站的URL信息。
"same-origin", // 表示瀏覽器只會顯示referrer信息給同源網站,並且是完整的URL信息。所謂同源網站,是協議、域名、端口都相同的網站。
"origin", // 表示瀏覽器在referrer字段中只顯示源網站的源地址(即協議、域名、端口),而不包括完整的路徑。
"strict-origin", // 該策略更為安全些,和origin策略相似,只是不允許referrer信息顯示在從https網站到http網站的請求中(安全降級)。
"origin-when-cross-origin", // 當發請求給同源網站時,瀏覽器會在referrer中顯示完整的URL信息,發個非同源網站時,則只顯示源地址(協議、域名、端口)
"strict-origin-when-cross-origin", // 和origin-when-cross-origin相似,只是不允許referrer信息顯示在從https網站到http網站的請求中(安全降級)。
"unsafe-url" // 瀏覽器總是會將完整的URL信息顯示在referrer字段中,無論請求發給任何網站。
};
Referrer-Policy更改方法
-
通過Referrer-Policy HTTP header設置:
Referrer-Policy: origin
-
通過元素改變Referrer Policy,直接修改名為referrer的內容
<meta name="referrer" content="origin">
-
給
<a>
,<area>
,<img>
,<iframe>
, 或者<link>
元素設置referrerpolicy屬性
<a href="http://example.com" referrerpolicy="origin">
-
如需設置不顯示referrer信息時,也可以給
<a>, <area>, <link>
元素設置rel的鏈接關系。
<img src="http://example.com" rel="noreferrer">
總結
使用何種Referrer Policy取決於網站的需求,但是一般來說,unsafe-url是不太建議用的,同樣,如果是只想顯示網站的根地址,那么建議用strict-origin和strict-origin-when-cross-origin。如果URL中沒有什么敏感信息,那就默認使用no-referrer-when-downgrade。