cookie

cookie 概念

cookie 的英文意思有兩個一個是餅干效床,另一個是堅強的人。將數(shù)據(jù)信息命名為 cookie 的原因可以看這個

cookie 是服務(wù)器產(chǎn)生的數(shù)據(jù)信息(部分 cookie 也可能是由網(wǎng)頁 javascript 代碼注入)迂猴,存儲在瀏覽器中,常用來存儲用戶信息等背伴。

cookie 的存儲是通過一個字符串來完成的

"name=xxx;age=123"

既然 cookie 這個概念代表一部分?jǐn)?shù)據(jù)沸毁,那么下面我們將討論數(shù)據(jù)的來源、存儲以及應(yīng)用

cookie 的來源

  • 服務(wù)器: 服務(wù)器可以通過設(shè)置 cookie 直接在瀏覽器中存儲相關(guān)數(shù)據(jù)
  • javascript 可以新增傻寂、修改(部分 cookie)

cookie 的存儲

cookie 的存儲以及修改會涉及到 cookie 的配置問題息尺,下面對相關(guān)配置進(jìn)行總結(jié)

Expires

cookie 的最長有效時間,如果沒有設(shè)置這個屬性疾掰,瀏覽器關(guān)閉時 cookie 會被清除

Max-Age

經(jīng)過多少秒 cookie 過期搂誉,如果也存在 Expires 屬性,已 Max-Age 為準(zhǔn)静檬。也就是說 Max-Age 比 Expires 權(quán)重要高炭懊。

Domain

域名規(guī)定 cookie 可被發(fā)送的域名,如果不設(shè)置,默認(rèn)為當(dāng)前頁面的 host拂檩。如果設(shè)置了侮腹,子域名都是允許的。

比如 Domain = a.com稻励,那么域名 b.a.com 就是允許訪問這個 cookie 的父阻。

Path

頁面路徑和域名的設(shè)置原理基本一致,/ 字符被認(rèn)為是文件名的分隔符望抽。 如果你設(shè)定 Path=/docs 那么

  • /docs
  • /docs/web
    都是可以訪問 cookie 的

Secure

設(shè)定之后加矛,只有是 http 協(xié)議才能訪問這個 cookie

HttpOnly

設(shè)置后 javascript 無法訪問這個 cookie

SameSite

  • Strict 嚴(yán)格模式,禁止所有跨域的 cookie 發(fā)送
  • None 完全允許煤篙,允許所有跨域的 cookie 發(fā)送
  • Lax 寬松模式斟览,允許部分跨域 cookie 發(fā)送

cookie 的跨域使用

在瀏覽器存儲由接口返回的 cookie 后,此后的每一個請求辑奈,只要是滿足 cookie 的設(shè)置苛茂,cookie 都會被 http 請求攜帶。

我在這一部分會重點對跨域請求的 cookie 攜帶做一個總結(jié)身害。

cors 接口跨域請求

對于cookie 的使用味悄,一個主動地使用場景就是請求跨域的接口草戈,如果這個跨域的接口需要攜帶 cookie 有以下兩個方面需要考慮

withCredentials

跨域請求接口塌鸯,瀏覽器默認(rèn)是不會攜帶 cookie 的

在調(diào)用接口后,我們需要指定一個屬性 withCredentials

const invocation = new XMLHttpRequest();
const url = 'https://bar.other/resources/credentialed-content/';

function callOtherDomain() {
  if (invocation) {
    invocation.open('GET', url, true);
    // 在指定這個屬性后唐片,接口調(diào)用才有可能攜帶 cookie
    invocation.withCredentials = true;
    invocation.onreadystatechange = handler;
    invocation.send();
  }
}


cors 跨域請求分兩種一種是簡單請求,一種是復(fù)雜請求 (不理解請自行baidu)

  • 如果是簡單請求,當(dāng)設(shè)置此屬性后,跨域請求會直接攜帶相關(guān)的 cookie
  • 復(fù)雜請求會等待 option 預(yù)請求回來后丙猬,才會攜帶相關(guān) cookie

SameSite

SameSite 屬性是瀏覽器除了 withCredentials 判斷跨域請求是否可以攜帶此 cookie 的另一個機制涨颜。

瀏覽器的跨域請求必須同時滿足這兩個機制,才能將 cookie 發(fā)出茧球。

除了我們在 javascript 中使用 XMLHttpRequest 以及 fetch庭瑰。我們還會在 html 中引入一下標(biāo)簽,常用的比如 img抢埋、iframe 等弹灭。其中這些資源也會涉及到 cookie 發(fā)送的問題,這些問題往往被我們所忽視:

請求類型 示例 strict None lax
鏈接 < a href=""></a>
預(yù)加載 <link ref="prerender" href="" />
get 表單 <form method="get">
post 表單 <form method="post">
iframe <iframe src="">
AJAX get("")
image <img src="">

其中需要特別注意的就是 a 標(biāo)簽揪垄,當(dāng)點擊標(biāo)簽后穷吮,如果 same-site 屬性為 strict,跳轉(zhuǎn)過去的頁面是不會攜帶 cookie 的饥努。所以會造成很多網(wǎng)頁的登錄狀態(tài)失效捡鱼,這個要特別注意。

所以我覺得默認(rèn)的 lax 其實是比較合適的酷愧,在安全性以及易用性上保持平衡

cookie 與安全

在學(xué)習(xí)使用 egg 的過程中驾诈,會涉及到一些關(guān)于 cookie 安全的問題。下面對這些 cookie的安全問題做一個總結(jié)

csrf-token

csrf (cross-site request forgery) 跨站請求偽造溶浴。一句話解釋就是乍迄,攻擊者會利用 cookie 信息,在第三方網(wǎng)頁上偽造真實請求士败,進(jìn)行網(wǎng)絡(luò)攻擊就乓。

特點:

  • 攻擊一般發(fā)生在第三方網(wǎng)站,而不是被攻擊的網(wǎng)站拱烁。
  • 攻擊者利用受害者 cookie 信息生蚁,冒充受害者身份,進(jìn)行網(wǎng)絡(luò)交互戏自。

解決方式

第一種就是 same-site 屬性邦投。當(dāng)然只有支持這個屬性的瀏覽器才可以。如果是版本較老的瀏覽器就不行了擅笔。

第二種方式就是 csrf-token

csrf-token 簡單說就是在 cookie 中存儲一個新的字段志衣,通過網(wǎng)絡(luò)請求頁面時服務(wù)器注入一個加密的字符串,在之后的網(wǎng)絡(luò)請求時猛们,都會攜帶這個字符串念脯,如果服務(wù)器判斷字符串不合法,就不會返回真實數(shù)據(jù)以及數(shù)據(jù)交互弯淘。

csrf-token 的實現(xiàn)也有兩種方式绿店。

  1. 第一種就是 session 存儲, 服務(wù)器會在內(nèi)存或者數(shù)據(jù)庫存儲 session 數(shù)據(jù)。
  2. 第二種方式是規(guī)定所有接口都要攜帶一個新的請求頭攜帶 csrf-token 數(shù)值,并且瀏覽器也會自動在 cookie 字段中攜帶 csrf-token 數(shù)值假勿。服務(wù)器會在收到請求時比對這兩個 token 是否一致來判斷是否來自于第三方頁面借嗽。

我比較喜歡第二種方式,因為可以減輕服務(wù)器的壓力转培,實現(xiàn)也比較簡單恶导。

cookie 防篡改

cookie 存儲在瀏覽器中,javascript浸须、用戶手動都是可以進(jìn)行修改的惨寿。

為了防止 cookie 被篡改,可以在服務(wù)器下發(fā) cookie 的時候删窒,同時下發(fā)一個根據(jù)內(nèi)容加密的 cookie 字段缤沦。


set-cookie name=008; path=/; httponly
set-cookie name.sig=BKz_FtEld6gVjNwSzdNZAXZCq3n2Vf7VcHISiEBp7oc; path=/; httponly

其中 name.sig 就是防止篡改的字段。當(dāng)服務(wù)器接收到 name 時會同時和 name.sig 進(jìn)行比對易稠,如果不一致缸废,就意味著 cookie 被篡改了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驶社,隨后出現(xiàn)的幾起案子企量,更是在濱河造成了極大的恐慌,老刑警劉巖亡电,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届巩,死亡現(xiàn)場離奇詭異,居然都是意外死亡份乒,警方通過查閱死者的電腦和手機恕汇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來或辖,“玉大人瘾英,你說我怎么就攤上這事∷滔荆” “怎么了缺谴?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耳鸯。 經(jīng)常有香客問我湿蛔,道長,這世上最難降的妖魔是什么县爬? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任阳啥,我火速辦了婚禮,結(jié)果婚禮上财喳,老公的妹妹穿的比我還像新娘察迟。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布卷拘。 她就那樣靜靜地躺著喊废,像睡著了一般祝高。 火紅的嫁衣襯著肌膚如雪栗弟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天工闺,我揣著相機與錄音乍赫,去河邊找鬼。 笑死陆蟆,一個胖子當(dāng)著我的面吹牛雷厂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叠殷,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼改鲫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了林束?” 一聲冷哼從身側(cè)響起像棘,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壶冒,沒想到半個月后缕题,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡胖腾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年烟零,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咸作。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨阿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出记罚,到底是詐尸還是另有隱情群井,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布毫胜,位于F島的核電站书斜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酵使。R本人自食惡果不足惜荐吉,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望口渔。 院中可真熱鬧样屠,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至业踢,卻和暖如春栗柒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背知举。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工瞬沦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雇锡。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓逛钻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锰提。 傳聞我的和親對象是個殘疾皇子曙痘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容