[HTTP趣談]身份認(rèn)證(Cookies vs Tokens)

只要是需要登錄的系統(tǒng)盆犁,就必然涉及到“身份驗(yàn)證”,那么篡九,前端是如何配合后臺(tái)做身份驗(yàn)證呢谐岁?

一般由兩種模式,Cookies和Tokens榛臼。前者是傳統(tǒng)模式伊佃,后者乃新起之秀。先看一張對(duì)比圖沛善,大致了解二者差異:


cookie-vs-token.png

共同點(diǎn)

  • 都是利用HTTP request header來(lái)傳遞身份信息
  • 都需要后臺(tái)給予驗(yàn)證身份的唯一ID(也可理解為唯一的驗(yàn)證信息)

下面分別分析這兩種模式航揉。

Cookies

Cookies驗(yàn)證是有狀態(tài)(stateful)的。這意味著金刁,權(quán)限信息(比如session ID)必須同時(shí)在客戶端和服務(wù)端維護(hù)迷捧。服務(wù)端需要根據(jù)session cookies信息去數(shù)據(jù)庫(kù)查詢用戶相關(guān)信息织咧;客戶端每次發(fā)起請(qǐng)求時(shí)都必須帶上Cookies信息作為身份驗(yàn)證。

Cookies有如下特征:

  1. 不需要前端存儲(chǔ)
    Cookies由后臺(tái)設(shè)置(response header里的Set-Cookie)漠秋,瀏覽器會(huì)在后續(xù)的請(qǐng)求中自動(dòng)加上Cookies信息笙蒙。
  2. 有CSRF(跨站點(diǎn)偽造請(qǐng)求)風(fēng)險(xiǎn)
    Cookies是不支持跨域訪問(wèn)的,一般只能在某個(gè)域名及其子域名下被訪問(wèn)庆锦。但是捅位,由于Cookies可以通過(guò)JS代碼獲取(document.cookies)搂抒,由此艇搀,可能會(huì)引發(fā)安全問(wèn)題,比如著名的CSRF攻擊(跨站請(qǐng)求偽造)求晶。
  3. 移動(dòng)端用在使用cookie時(shí)有各種不便利和局限
    移動(dòng)端平臺(tái)和Cookies配合并不是太好焰雕,可能會(huì)在Cookies使用上有局限性。
  4. Cookies可以在同一域名下或者同一主域不同子域下共享芳杏,一旦跨主域矩屁,就無(wú)法共享
    如果遇到跨域共享身份信息的情況,就必須靠服務(wù)器協(xié)助(例如單點(diǎn)登錄:一個(gè)身份爵赵,需要登錄多個(gè)主域)
cookie.png
小貼士

API跨域請(qǐng)求時(shí)吝秕,如果請(qǐng)求方式為JSONP,那么空幻,瀏覽器會(huì)自動(dòng)在request請(qǐng)求中帶上Cookies烁峭。
* JSONP利用script標(biāo)簽實(shí)現(xiàn)跨越,而script標(biāo)簽的src屬性發(fā)起的請(qǐng)求類似資源文件請(qǐng)求秕铛;
* 瀏覽器有一個(gè)特點(diǎn):從WEB頁(yè)面產(chǎn)生的文件請(qǐng)求都會(huì)帶上COOKIE约郁;

如果是CORS跨域,客戶端AJAX請(qǐng)求必須設(shè)置withCredentials頭信息為true但两。

Token

Token是無(wú)狀態(tài)的(stateless)鬓梅。也就是說(shuō),服務(wù)端不需要在數(shù)據(jù)庫(kù)中存儲(chǔ)和Token相關(guān)的字段镜遣,Token本身就已經(jīng)包含了用戶的所有信息(生成Token的方式很多,其中比較著名的是JWTs: JSON Web Tokens)士袄。
客戶端一般在request header里面利用Authorization頭傳遞Token值悲关,格式為Bearer {JWT}(該格式并不是絕對(duì)的,要根據(jù)服務(wù)端具體情況來(lái)設(shè)置)娄柳。

Token有如下特征:

  1. Token值同樣需要服務(wù)端提供(通過(guò)API返回)
    和Cookies不同寓辱,返回值不需要掛載在Set-Cookie上,而是利用其它response header或者response body返回Token值赤拒;
  2. 需要客戶端存儲(chǔ)
    和Cookies不同秫筏,瀏覽器無(wú)法自動(dòng)在下一次請(qǐng)求中自動(dòng)掛載身份信息诱鞠。客戶端必須自行存儲(chǔ)Token值(建議用localstorage)这敬,然后在后續(xù)請(qǐng)求中通過(guò)設(shè)置request header來(lái)傳遞Token信息航夺;
  3. 無(wú)CSRF風(fēng)險(xiǎn)
  4. 適合移動(dòng)端身份認(rèn)證
  5. Token支持各類跨域
token.png

客戶端如何設(shè)置Token?代碼如下:

// JS
var res = new XMLHttpRequest();
...
req.setRequestHeader('Authorization',"Bearer " + token);
// JQuery
$.ajax({
  url: api,
  type: "GET",
  headers: { "Authorization": "Bearer " + token}
})

小結(jié)

目前崔涂,大部分應(yīng)用還是用Cookies做身份驗(yàn)證(尤其是PC端)阳掐;移動(dòng)端HTML5頁(yè)面(Hybird App)API的權(quán)限驗(yàn)證,更多會(huì)采用Token冷蚂,并且走HTTPS協(xié)議缭保。

參考文章:Cookies vs Tokens: The Definitive Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝙茶,隨后出現(xiàn)的幾起案子艺骂,更是在濱河造成了極大的恐慌,老刑警劉巖隆夯,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳恕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吮廉,警方通過(guò)查閱死者的電腦和手機(jī)苞尝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宦芦,“玉大人宙址,你說(shuō)我怎么就攤上這事〉鞅埃” “怎么了抡砂?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恬涧。 經(jīng)常有香客問(wèn)我注益,道長(zhǎng),這世上最難降的妖魔是什么溯捆? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任丑搔,我火速辦了婚禮,結(jié)果婚禮上提揍,老公的妹妹穿的比我還像新娘啤月。我一直安慰自己,他們只是感情好劳跃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布谎仲。 她就那樣靜靜地躺著,像睡著了一般刨仑。 火紅的嫁衣襯著肌膚如雪郑诺。 梳的紋絲不亂的頭發(fā)上夹姥,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辙诞,去河邊找鬼辙售。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倘要,可吹牛的內(nèi)容都是我干的圾亏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼封拧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼志鹃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泽西,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曹铃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捧杉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕见,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年味抖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了评甜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔涩,死狀恐怖忍坷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熔脂,我是刑警寧澤佩研,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站霞揉,受9級(jí)特大地震影響旬薯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜适秩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一绊序、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽荞,春花似錦骤公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耗式。三九已至胁住,卻和暖如春趁猴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彪见。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工儡司, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人余指。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓捕犬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酵镜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碉碉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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