前段時間開發了一個用戶登陸的模塊,需求很簡單,用戶輸入手機號和驗證碼,咱們就會返回給用戶一套身份信息並保存在cookie裏面。so easy,因而就有如下代碼:javascript
// 大體意思以下,並不是真實模塊中的代碼 document.cookie = 'token=xxxxxxxx;domain=xxx.com;path=/;expires=xxxx';
大功告成!可是,問題也來了,這樣作並不安全,用戶的信息能夠輕易的經過JS獲取,XSS
,CSRF
變的垂手可得。因而,咱們將種cookie的操做交給了服務端,並給其中一個cookie加上了httponly
屬性,這個屬性僅僅保證咱們的cookie不能經過document.cookie
來獲取,減少了用戶cookie被竊取的機率。java
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
好啦,再次大功告成。可是,過了一段時間,咱們的網站多啦,同時存在了幾個域名,咱們須要在用戶登陸的時,同時給多個域種cookie。OK,很簡單,咱們只須要調用多個域名下的種cookie的接口,不就行啦?跨域
事情沒有這麼簡單,通過測試以後發現咱們的cookie在某些特定的瀏覽器下有可能跨域種cookie失敗。爲何呢?通過一番google以後,發現實際上是一些瀏覽器對於跨域種cookie作了一些限制,咱們須要用一些方法來解決限制。瀏覽器
P3P由萬維網協會研製,它爲Web用戶提供了對本身公開信息的更多的控制。支持P3P的Web站點能夠爲瀏覽者聲明他們的隱私策略。安全
其實上面都是廢話,大概意思就是說你要在你的http header裏面加入一個P3P協議的說明,詳細信息能夠看這個歪果仁寫的文章"P3P, Cookies and IE6.0: A Case Study"cookie
P3P:CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
很開心,再次大功告成。BUT,現實老是這麼殘酷,safari上仍然不能跨域種cookie。這又是爲何呢?根據蘋果爸爸的尿性來推測,確定又是他作了什麼安全性的限制。果真!在safari瀏覽器中打開設置 > 隱私 > 阻止cookie > 永不
,打開上述設置以後,跨域種cookie瞬間成功。可是,咱們總不能要求用戶一個個去打開這個設置吧?因此還要另尋解決辦法。dom
後來咱們發現其實對於safari來講所謂的第三方須要知足兩個條件:ssh
用戶歷來沒有主動訪問該域名測試
該域名並無做爲第一方種過cookie網站
基於以上兩點咱們作了2個操做:
經過http 302
的方式來跨域種cookie
在用戶訪問咱們的域名以後,默認在訪問域名下種下一個記錄性的cookie,減少咱們的域名種Cookie失敗的機率
好啦,此次真的大功告成啦,寫一篇流水帳記錄一下這個坑。
博客地址:ssh.today,歡迎關注