瀏覽器的“域”問題

一、瀏覽器的“同源策略”

     1、同源三要素

          協議、域名、端口

          三者只要用一個不同,即不滿足同源。

               (1)http\https的互相訪問限制

                    在https(安全)的域名所在頁面中訪問http(不安全)的資源,會受限。

二、cookie的作用域

     1、協議、域名、path

          學過Java的同學都應該知道想往response裏設置cookie之前會設置一些屬性。這些屬性包括domain(域)、security(協議)、path、version、age等等,這裏可以和“同源策略”對應起來。

     2、cookie的作用域與“同源策略”

          接着第一點的說,cookie的作用域與“同源策略”三要素基本是對應關係。但是,但是,但是!我看有很多網站說不滿足“同源策略”時,cookie是獲取不到的。這裏有一個例外,就是端口號。我在本地實驗的結果告訴我,同協議、同域名、不同端口之間,既可以獲取互相的cookie,也可以互相種cookie。爲什麼?學過Java的同學們,你們想想,什麼時候見過設置cookie屬性的時候,還要設置端口號的...

     3、經驗之談

          (1)不同域名之間是無法跨域種cookie的。eg:在頁面上發起一個請求,這個請求域名是aaa.lenovo.com.cn,但是我在response裏設置domain爲bbb.lenovo.com的cookie,請求完成後,去bbb.lenovo.com.cn的頁面上查看,並不會有我剛剛設置的cookie。

          (2)子父域問題

            lenovo.com.cn是aaa.lenovo.com.cn的父域。子域可以獲取到父域的cookie,反之則不行。所以我們在種全站cookie的時候(比如登錄狀態),都會種到全站域名的父域上,這樣全站可以共享登錄狀態。當然這裏說的全站域名都是一個父域的情況。

          (3)跨域種cookie問題

             既然第一點已經說到,無法跨域種cookie,但是我們就是想給bbb.lenovo.com種cookie,這時候可以申請個reg.bbb.lenovo.com的域名,在response裏設置cookie的domain爲bbb.lenovo.com不就行了。當然,會有人說,爲什麼不設置domain爲lenovo.com呢?這也是可以的。但是我們在設置cookie作用域時,出於安全角度考慮,儘量將cookie作用域設置的越小越好。

          (4)Safari

             還記得當年蘋果公司拒絕配合FBI調查用戶信息,這也就是說蘋果對於個人信息的保密程度相當之高,但這也給我們跨域種cookie帶來困擾。

             在高版本Safari瀏覽器下,會存在這樣的問題:

             我在aaa.lenovo.com.cn的頁面上發起一個bbb.lenovo.com的跨域請求,希望這個請求的response裏能夠設置domain爲lenovo.com的cookie,這在其他瀏覽器上是被允許的,但是Safari會跟你說:NO!我認爲,Safari的判斷中,還會加上種cookie請求所在頁面的域名。即,頁面域名+請求域名+cookie的domain這三者必須同源...這近似苛刻的條件會使跨域種cookie變得異常困難。所以,在Safari中,利用跨域種cookie實現的功能只能換一種方案了。(可以參考taobao.com與tmall.com如何實現SSO,具體我也還在研究中)

             當然除了Safari,在華爲、小米的最新版型號手機自帶瀏覽器中也出現了諸如此類的問題。安全無小事,這樣的設定可能是爲了最大限度保護用戶的隱私,這樣一想,也未必是一件壞事。

          (5)tomcat

            what?tomcat?跟它有啥關係?對的,你沒看錯。tomcat8.5版本之前,在設置cookie的domain屬性時,你可以在域名前面加個點(eg:.lenovo.com.cn),表示這個cookie要種在父域上。但是tomcat8.5之後,你貓會給你返回一個大大的500報錯。原因是你貓會認爲你的domain是個非法參數,所以,你代碼裏之前有設置cookie,在domain前面加過點的,請謹慎升級tomcat到8.5....

三、跨域請求(Ajax)

     1、不滿足“同源策略”的請求是不允許使用ajax調用的。

     2、跨域請求的方式,接觸最多的方式的思想應該是將動態請求變成靜態資源請求。

          jsonp\new img()\iframe等等,可以自行百度。

 

以上爲自己的工作之中的思考與總結,如有錯誤,請斧正,多謝!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章