Cookie Session Token JWT & CSRF

前言:

夏洛:大爺狼钮,樓上322住的是馬冬梅家吧?
大爺:馬都什么捡絮?
夏洛:馬冬梅熬芜。
大爺:什么都沒啊福稳?
夏洛:馬冬梅啊涎拉。
大爺:馬什么沒?
夏洛:行,大爺你先涼快著吧鼓拧。

基于 http 協(xié)議的 web 應用程序是請求——應答模式是無狀態(tài)的半火,我們可以這樣理解:每次的請求都是獨立的,它的執(zhí)行情況和結(jié)果與前面的請求和之后的請求是無直接關(guān)系的季俩,它不會受前面的請求應答情況直接影響钮糖,也不會直接影響后面的請求應答情況。
為了讓Web服務器有記憶酌住,有狀態(tài)店归,有以下幾種方法。

Cookie

  1. 瀏覽器第一次訪問服務端時赂韵,服務器此時肯定不知道他的身份娱节,所以創(chuàng)建一個獨特的身份標識數(shù)據(jù),格式為key=value祭示,放入到Set-Cookie字段里肄满,隨著響應報文發(fā)給瀏覽器。
  2. 瀏覽器看到有Set-Cookie字段以后就知道這是服務器給的身份標識质涛,于是就保存起來稠歉,下次請求時會自動將此key=value值放入到Cookie字段中發(fā)給服務端。
  3. 服務端收到請求報文后汇陆,發(fā)現(xiàn)Cookie字段中有值怒炸,就能根據(jù)此值識別用戶的身份然后提供個性化的服務。
image.png

Cookie就是服務器委托瀏覽器存儲在客戶端里的一些數(shù)據(jù)毡代,而這些數(shù)據(jù)通常都會記錄用戶的關(guān)鍵識別信息阅羹。所以Cookie需要用一些其他的手段用來保護,防止外泄或者竊取教寂,這些手段就是Cookie的屬性捏鱼。

參數(shù)名 作用 后端設置方法
Max-Age 設置cookie的過期時間,單位為秒 cookie.setMaxAge(10)
Domain 指定了Cookie所屬的域名 cookie.setDomain("")
Path 指定了Cookie所屬的路徑 cookie.setPath("");
HttpOnly 告訴瀏覽器此Cookie只能靠瀏覽器Http協(xié)議傳輸,禁止其他方式訪問 cookie.setHttpOnly(true)
Secure 告訴瀏覽器此Cookie只能在Https安全協(xié)議中傳輸,如果是Http則禁止傳輸 cookie.setSecure(true)

Path

設置為cookie.setPath("/testCookies")酪耕,接下來我們訪問http://localhost:8005/testCookies导梆,我們可以看到在左邊和我們指定的路徑是一樣的,所以Cookie才在請求頭中出現(xiàn)迂烁,接下來我們訪問http://localhost:8005看尼,我們發(fā)現(xiàn)沒有Cookie字段了,這就是Path控制的路徑盟步。

Domain

設置為cookie.setDomain("localhost")藏斩,接下來我們訪問http://localhost:8005/testCookies我們發(fā)現(xiàn)下圖中左邊的是有Cookie的字段的,但是我們訪問http://172.16.42.81:8005/testCookies却盘,看下圖的右邊可以看到?jīng)]有Cookie的字段了狰域。這就是Domain控制的域名發(fā)送Cookie窜觉。

Session

Cookie是存儲在客戶端方,Session是存儲在服務端方北专,客戶端只存儲SessionId

image.png
@RequestMapping("/testSession")
@ResponseBody
public String testSession(HttpSession session){
    session.setAttribute("testSession","this is my session");
    return "testSession";
}


@RequestMapping("/testGetSession")
@ResponseBody
public String testGetSession(HttpSession session){
    Object testSession = session.getAttribute("testSession");
    return String.valueOf(testSession);
}

我們在請求參數(shù)中加上HttpSession session,然后再瀏覽器中輸入http://localhost:8005/testSession進行訪問可以看到在服務器的返回頭中在Cookie中生成了一個SessionId旬陡。然后瀏覽器記住此SessionId下次訪問時可以帶著此Id拓颓,然后就能根據(jù)此Id找到存儲在服務端的信息了。

image.png

過期時間:

客戶端:和Cookie過期一致描孟,如果沒設置驶睦,默認是關(guān)了瀏覽器就沒了,即再打開瀏覽器的時候初次請求頭中是沒有SessionId了匿醒。
服務端:服務端的過期是真的過期场航,即服務器端的Session存儲的數(shù)據(jù)結(jié)構(gòu)多久不可用了,默認是30分鐘廉羔。

Session是存儲在Tomcat(以此為例)的容器中溉痢,所以如果后端機器是多臺的話,因此多個機器間是無法共享Session的憋他,此時可以使用Spring提供的分布式Session的解決方案孩饼,是將Session放在了Redis中。

Token

Session是將要驗證的信息存儲在服務端竹挡,并以SessionId和數(shù)據(jù)進行對應镀娶,SessionId由客戶端存儲,在請求時將SessionId也帶過去揪罕,因此實現(xiàn)了狀態(tài)的對應梯码。而Token是在服務端將用戶信息經(jīng)過Base64Url編碼過后傳給在客戶端,每次用戶請求的時候都會帶上這一段信息好啰,因此服務端拿到此信息進行解密后就知道此用戶是誰了轩娶,這個方法叫做JWT(Json Web Token)。

image.png

Token相比較于Session的優(yōu)點在于坎怪,當后端系統(tǒng)有多臺時罢坝,由于是客戶端訪問時直接帶著數(shù)據(jù),因此無需做共享數(shù)據(jù)的操作搅窿。

Token的優(yōu)點

  1. 簡潔:可以通過URL,POST參數(shù)或者是在HTTP頭參數(shù)發(fā)送嘁酿,因為數(shù)據(jù)量小,傳輸速度也很快
  2. 自包含:由于串包含了用戶所需要的信息男应,避免了多次查詢數(shù)據(jù)庫
  3. 因為Token是以Json的形式保存在客戶端的闹司,所以JWT是跨語言的
  4. 不需要在服務端保存會話信息,特別適用于分布式微服務

CSRF攻擊

image.png

可以這么理解:有一個人發(fā)給你一個搞(mei)笑(nv)圖片鏈接沐飘,你打開這個鏈接之后游桩,便立刻收到了短信:你的銀行里的錢已經(jīng)轉(zhuǎn)移到這個人的帳戶了赋焕。

1.登錄受信任網(wǎng)站A,并在本地生成Cookie充岛。
2.在不登出A的情況下敦姻,訪問危險網(wǎng)站B。

CSRF 攻擊的對象

在討論如何抵御 CSRF 之前铐刘,先要明確 CSRF 攻擊的對象陪每,也就是要保護的對象。從以上的例子可知镰吵,CSRF 攻擊是黑客借助受害者的 cookie 騙取服務器的信任檩禾,但是黑客并不能拿到 cookie,也看不到 cookie 的內(nèi)容疤祭。另外盼产,對于服務器返回的結(jié)果,由于瀏覽器同源策略的限制勺馆,黑客也無法進行解析戏售。因此,黑客無法從返回的結(jié)果中得到任何東西草穆,他所能做的就是給服務器發(fā)送請求蜈项,以執(zhí)行請求中所描述的命令,在服務器端直接改變數(shù)據(jù)的值续挟,而非竊取服務器中的數(shù)據(jù)紧卒。所以,我們要保護的對象是那些可以直接產(chǎn)生數(shù)據(jù)改變的服務诗祸,而對于讀取數(shù)據(jù)的服務跑芳,則不需要進行 CSRF 的保護。比如銀行系統(tǒng)中轉(zhuǎn)賬的請求會直接改變賬戶的金額直颅,會遭到 CSRF 攻擊博个,需要保護。而查詢余額是對金額的讀取操作功偿,不會改變數(shù)據(jù)盆佣,CSRF 攻擊無法解析服務器返回的結(jié)果,無需保護械荷。

當前防御 CSRF 的幾種策略

  1. 驗證 HTTP Referer 字段
    服務器驗證Referer 字段共耍,如果不是受信網(wǎng)站則拒絕請求。

問題:使用驗證 Referer 值的方法吨瞎,就是把安全性都依賴于第三方(即瀏覽器)來保障痹兜,從理論上來講,這樣并不安全颤诀。事實上字旭,對于某些瀏覽器对湃,比如 IE6 或 FF2,目前已經(jīng)有一些方法可以篡改 Referer 值遗淳。如果 bank.example 網(wǎng)站支持 IE6 瀏覽器拍柒,黑客完全可以把用戶瀏覽器的 Referer 值設為以 bank.example 域名開頭的地址,這樣就可以通過驗證屈暗,從而進行 CSRF 攻擊斤儿。并且用戶可以設置不使用Referer。非100%安全恐锦。

  1. 用戶操作限制,比如驗證碼
    嚴重影響了用戶體驗疆液,而且還有額外的開發(fā)成本

  2. Token驗證的CSRF防御機制是公認最合適的方案

參考文檔

  1. cookie session token
    https://segmentfault.com/a/1190000021185229
  2. CSRF攻擊和跨域
    https://segmentfault.com/a/1190000021029334
    https://segmentfault.com/a/1190000005125790
    https://segmentfault.com/a/1190000006944760
    https://segmentfault.com/a/1190000003716037
    https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
    3.web安全周刊
    https://segmentfault.com/a/1190000007564080
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一铅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堕油,更是在濱河造成了極大的恐慌潘飘,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉缺,死亡現(xiàn)場離奇詭異卜录,居然都是意外死亡,警方通過查閱死者的電腦和手機眶明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門艰毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搜囱,你說我怎么就攤上這事丑瞧。” “怎么了蜀肘?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵绊汹,是天一觀的道長。 經(jīng)常有香客問我扮宠,道長西乖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任坛增,我火速辦了婚禮获雕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘收捣。我一直安慰自己典鸡,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布坏晦。 她就那樣靜靜地躺著萝玷,像睡著了一般嫁乘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球碉,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天蜓斧,我揣著相機與錄音,去河邊找鬼睁冬。 笑死挎春,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的豆拨。 我是一名探鬼主播直奋,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼施禾!你這毒婦竟也來了脚线?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弥搞,失蹤者是張志新(化名)和其女友劉穎邮绿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀例,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡船逮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粤铭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挖胃。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梆惯,靈堂內(nèi)的尸體忽然破棺而出冠骄,到底是詐尸還是另有隱情,我是刑警寧澤加袋,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布凛辣,位于F島的核電站,受9級特大地震影響职烧,放射性物質(zhì)發(fā)生泄漏扁誓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一蚀之、第九天 我趴在偏房一處隱蔽的房頂上張望蝗敢。 院中可真熱鬧,春花似錦足删、人聲如沸寿谴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶泰。三九已至咏瑟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痪署,已是汗流浹背码泞。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狼犯,地道東北人余寥。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像悯森,于是被迫代替她去往敵國和親宋舷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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