前段時間開發(fā)了一個用戶登錄的模塊瘩扼,需求很簡單兰怠,用戶輸入手機號和驗證碼,我們就會返回給用戶一套身份信息并保存在cookie里面霸妹。so easy十电,于是就有以下代碼:
// 大致意思如下,并非真實模塊中的代碼
document.cookie = 'token=xxxxxxxx;domain=xxx.com;path=/;expires=xxxx';
大功告成叹螟!但是鹃骂,問題也來了,這樣做并不安全罢绽,用戶的信息可以輕易的通過JS獲取畏线,XSS
,CSRF
變的輕而易舉有缆。于是象踊,我們將種cookie的操作交給了服務端温亲,并給其中一個cookie加上了httponly
屬性棚壁,這個屬性僅僅保證我們的cookie不能通過document.cookie
來獲取,減小了用戶cookie被竊取的概率栈虚。
Set-Cookie:token1=xxxxx; expires=GMT Date; Max-Age=xxx; path=/; domain=xxx.com
Set-Cookie:token2=xxxxx; expires=GMT Date; Max-Age=xxx; path=/; domain=xxx.com; httponly
好啦袖外,再次大功告成。但是魂务,過了一段時間曼验,我們的網(wǎng)站多啦,同時存在了幾個域名粘姜,我們需要在用戶登錄的時鬓照,同時給多個域種cookie。OK孤紧,很簡單豺裆,我們只需要調(diào)用多個域名下的種cookie的接口,不就行啦号显?
事情沒有這么簡單臭猜,經(jīng)過測試之后發(fā)現(xiàn)我們的cookie在某些特定的瀏覽器下有可能跨域種cookie失敗。為什么呢押蚤?經(jīng)過一番google之后蔑歌,發(fā)現(xiàn)其實是一些瀏覽器對于跨域種cookie做了一些限制,我們需要用一些方法來解決限制揽碘。
P3P由萬維網(wǎng)協(xié)會研制次屠,它為Web用戶提供了對自己公開信息的更多的控制园匹。支持P3P的Web站點可以為瀏覽者聲明他們的隱私策略。
其實上面都是廢話帅矗,大概意思就是說你要在你的http header里面加入一個P3P協(xié)議的說明偎肃,詳細信息可以看這個歪果仁寫的文章"P3P, Cookies and IE6.0: A Case Study"
P3P:CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
很開心,再次大功告成浑此。BUT累颂,現(xiàn)實總是這么殘酷,safari上仍然不能跨域種cookie凛俱。這又是為什么呢紊馏?根據(jù)蘋果爸爸的尿性來推測,肯定又是他做了什么安全性的限制蒲犬。果然朱监!在safari瀏覽器中打開設置 > 隱私 > 阻止cookie > 永不
,打開上述設置之后原叮,跨域種cookie瞬間成功赫编。但是,我們總不能要求用戶一個個去打開這個設置吧奋隶?所以還要另尋解決辦法擂送。
后來我們發(fā)現(xiàn)其實對于safari來說所謂的第三方需要滿足兩個條件:
- 用戶從來沒有主動訪問該域名
- 該域名并沒有作為第一方種過cookie
基于以上兩點我們做了2個操作:
- 通過
http 302
的方式來跨域種cookie - 在用戶訪問我們的域名之后,默認在訪問域名下種下一個記錄性的cookie唯欣,減小我們的域名種Cookie失敗的概率
好啦嘹吨,這次真的大功告成啦,寫一篇流水賬記錄一下這個坑境氢。
博客地址: ssh.today蟀拷,歡迎關注