淺析HTTP請求中的referrer和Referrer-Policy
本文將介紹一個涉及安全和隱私的http請求頭中的字段—referrer,以及如何通過Referrer Policy去修改referrer的值或者是顯示與否。
什么是referrer
當(dāng)一個用戶點擊當(dāng)前頁面中的一個鏈接,然后跳轉(zhuǎn)到目標(biāo)頁面時,目標(biāo)頁面會收到一個信息,即用戶是從哪個源鏈接跳轉(zhuǎn)過來的。如下圖所示:

也就是說,當(dāng)你發(fā)起一個http請求,請求頭中的referrer字段就說明了你是從哪個頁面發(fā)起該請求的。
使用場景
有時候我們需要控制這個referrer字段的值,即是否讓其顯示在請求頭中,或者是否顯示完整路徑等。尤其是在以下兩個使用場景:
隱私
在社交網(wǎng)站的個人中心頁面,也許會存在一些外鏈,這時候社交網(wǎng)站肯定不希望用戶在點擊這些鏈接跳轉(zhuǎn)到其他第三方網(wǎng)站時會將自己個人中心的URL信息顯示在referrer字段中傳過去,尤其是個人中心頁面的URL往往會帶著用戶數(shù)據(jù)和一些敏感信息。這時候可以選擇不顯示來源頁面URL信息或者只顯示一個網(wǎng)站根地址hostname。
安全
有些使用了https的網(wǎng)站,可能在URL中使用一個參數(shù)(sid)來作為用戶身份憑證,而又需要引入其他https網(wǎng)站的資源,這種情況,網(wǎng)站肯定不希望泄露用戶的身份憑證信息。當(dāng)https網(wǎng)站需要引入不安全的http網(wǎng)站的資源或者有鏈接要跳轉(zhuǎn)到http網(wǎng)站時,這時候?qū)ttps源網(wǎng)站的URL信息傳過去也是不太安全的。
當(dāng)然還有其他情況下需要referrer的值,比如最近公司所做的項目中,有一個請求由于請求頭過大導(dǎo)致響應(yīng)是400,我們的Referrer Policy是默認(rèn)的情況,顯示的referrer是完整的URL信息,該URL帶了很多敏感數(shù)據(jù)比如加密后的token,sessionID等,長度特別長,請求頭中的cookie和請求的URL也帶著很大塊的信息,最終我們決定讓referrer只攜帶網(wǎng)站根地址的信息而不是其完整路徑,由此減小了header的大小。
Referrer-Policy
Referrer-Policy的作用就是為了控制請求頭中referrer的內(nèi)容,目前是一個候選標(biāo)準(zhǔn),不過已經(jīng)有部分瀏覽器支持該標(biāo)準(zhǔn)。
目前Referrer-Policy只包含以下幾種值:
enum?ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};
空字符串
若設(shè)為空串則默認(rèn)按照瀏覽器的機(jī)制設(shè)置referrer的內(nèi)容,默認(rèn)情況下是和no-referrer-when-downgrade設(shè)置得一樣。
no-referrer
不顯示referrer的任何信息在請求頭中。
no-referrer-when-downgrade
這是默認(rèn)值。當(dāng)從https網(wǎng)站跳轉(zhuǎn)到http網(wǎng)站或者請求其資源時(安全降級HTTPS→HTTP),不顯示referrer的信息,其他情況(安全同級HTTPS→HTTPS,或者HTTP→HTTP)則在referrer中顯示完整的源網(wǎng)站的URL信息。
same-origin
表示瀏覽器只會顯示referrer信息給同源網(wǎng)站,并且是完整的URL信息。所謂同源網(wǎng)站,是協(xié)議、域名、端口都相同的網(wǎng)站。
origin
表示瀏覽器在referrer字段中只顯示源網(wǎng)站的源地址(即協(xié)議、域名、端口),而不包括完整的路徑。
strict-origin
該策略更為安全些,和origin策略相似,只是不允許referrer信息顯示在從https網(wǎng)站到http網(wǎng)站的請求中(安全降級)。
origin-when-cross-origin
當(dāng)發(fā)請求給同源網(wǎng)站時,瀏覽器會在referrer中顯示完整的URL信息,發(fā)個非同源網(wǎng)站時,則只顯示源地址(協(xié)議、域名、端口)
strict-origin-when-cross-origin
和origin-when-cross-origin相似,只是不允許referrer信息顯示在從https網(wǎng)站到http網(wǎng)站的請求中(安全降級)。
unsaft-url
瀏覽器總是會將完整的URL信息顯示在referrer字段中,無論請求發(fā)給任何網(wǎng)站。
Referrer-Policy更改方法
可以有以下5種方法:
1. 通過Referrer-Policy HTTP header設(shè)置:
Referrer-Policy: origin2. 通過元素改變Referrer Policy,直接修改名為referrer的內(nèi)容
<meta?name="referrer"?content="origin">