運(yùn)維自學(xué)-8-Token ,Cookie和Session的區(qū)別

在做接口測(cè)試時(shí)走搁,經(jīng)常會(huì)碰到請(qǐng)求參數(shù)為token的類型独柑,但是可能大部分測(cè)試人員對(duì)tokencookie私植,session的區(qū)別還是一知半解群嗤。為此我查閱大量的資料做了如下總結(jié)。?此篇文章也許是最全最通俗的關(guān)于Token兵琳,CookieSession的區(qū)別的文章,好好揣摩文章的每一個(gè)字骇径,也許你會(huì)有更深的理解躯肌!

Cookie

cookie 是一個(gè)非常具體的東西,指的就是瀏覽器里面能永久存儲(chǔ)的一種數(shù)據(jù)破衔,僅僅是瀏覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲(chǔ)功能清女。

cookie由服務(wù)器生成,發(fā)送給瀏覽器晰筛,瀏覽器把cookie以kv形式保存到某個(gè)目錄下的文本文件內(nèi)嫡丙,下一次請(qǐng)求同一網(wǎng)站時(shí)會(huì)把該cookie發(fā)送給服務(wù)器。由于cookie是存在客戶端上的读第,所以瀏覽器加入了一些限制確保cookie不會(huì)被惡意使用曙博,同時(shí)不會(huì)占據(jù)太多磁盤空間,所以每個(gè)域的cookie數(shù)量是有限的怜瞒。

Session

session 從字面上講父泳,就是會(huì)話。這個(gè)就類似于你和一個(gè)人交談吴汪,你怎么知道當(dāng)前和你交談的是張三而不是李四呢惠窄?對(duì)方肯定有某種特征(長(zhǎng)相等)表明他就是張三。

session 也是類似的道理漾橙,服務(wù)器要知道當(dāng)前發(fā)請(qǐng)求給自己的是誰杆融。為了做這種區(qū)分,服務(wù)器就要給每個(gè)客戶端分配不同的“身份標(biāo)識(shí)”霜运,然后客戶端每次向服務(wù)器發(fā)請(qǐng)求的時(shí)候脾歇,都帶上這個(gè)“身份標(biāo)識(shí)”,服務(wù)器就知道這個(gè)請(qǐng)求來自于誰了淘捡。至于客戶端怎么保存這個(gè)“身份標(biāo)識(shí)”介劫,可以有很多種方式,對(duì)于瀏覽器客戶端案淋,大家都默認(rèn)采用cookie 的方式座韵。

服務(wù)器使用session把用戶的信息臨時(shí)保存在了服務(wù)器上,用戶離開網(wǎng)站后session會(huì)被銷毀。這種用戶信息存儲(chǔ)方式相對(duì)cookie來說更安全誉碴,可是session有一個(gè)缺陷:如果web服務(wù)器做了負(fù)載均衡宦棺,那么下一個(gè)操作請(qǐng)求到了另一臺(tái)服務(wù)器的時(shí)候session會(huì)丟失。

Token

token的意思是“令牌”黔帕,是用戶身份的驗(yàn)證方式代咸,最簡(jiǎn)單的token組成:uid(用戶唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)成黄、sign(簽名呐芥,由token的前幾位以哈希算法壓縮成一定長(zhǎng)的十六進(jìn)制字符串,可以防止惡意第三方拼接token請(qǐng)求服務(wù)器)奋岁。還可以把不變的參數(shù)也放進(jìn)token思瘟,避免多次查庫

傳統(tǒng)身份驗(yàn)證

HTTP 是一種沒有狀態(tài)的協(xié)議,也就是它并不知道是誰是訪問應(yīng)用闻伶。這里我們把用戶看成是客戶端滨攻,客戶端使用用戶名還有密碼通過了身份驗(yàn)證,不過下回這個(gè)客戶端再發(fā)送請(qǐng)求時(shí)候蓝翰,還得再驗(yàn)證一下光绕。

解決的方法就是,當(dāng)用戶請(qǐng)求登錄的時(shí)候畜份,如果沒有問題诞帐,我們?cè)诜?wù)端生成一條記錄,這個(gè)記錄里可以說明一下登錄的用戶是誰爆雹,然后把這條記錄的ID 號(hào)發(fā)送給客戶端景埃,客戶端收到以后把這個(gè)ID 號(hào)存儲(chǔ)在 Cookie 里,下次這個(gè)用戶再向服務(wù)端發(fā)送請(qǐng)求的時(shí)候顶别,可以帶著這個(gè)Cookie 谷徙,這樣服務(wù)端會(huì)驗(yàn)證一個(gè)這個(gè)Cookie 里的信息,看看能不能在服務(wù)端這里找到對(duì)應(yīng)的記錄驯绎,如果可以完慧,說明用戶已經(jīng)通過了身份驗(yàn)證,就把用戶請(qǐng)求的數(shù)據(jù)返回給客戶端剩失。

上面說的就是Session屈尼,我們需要在服務(wù)端存儲(chǔ)為登錄的用戶生成的Session ,這些Session 可能會(huì)存儲(chǔ)在內(nèi)存拴孤,磁盤脾歧,或者數(shù)據(jù)庫里。我們可能需要在服務(wù)端定期的去清理過期的Session 演熟。

基于 Token 的身份驗(yàn)證

使用基于Token 的身份驗(yàn)證方法鞭执,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄司顿。大概的流程是這樣的:

客戶端使用用戶名跟密碼請(qǐng)求登錄

服務(wù)端收到請(qǐng)求,去驗(yàn)證用戶名與密碼

驗(yàn)證成功后兄纺,服務(wù)端會(huì)簽發(fā)一個(gè) Token大溜,再把這個(gè) Token 發(fā)送給客戶端

客戶端收到 Token 以后可以把它存儲(chǔ)起來,比如放在 Cookie 里或者 Local Storage 里

客戶端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的Token

服務(wù)端收到請(qǐng)求估脆,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 Token钦奋,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)

APP登錄的時(shí)候發(fā)送加密的用戶名和密碼到服務(wù)器疙赠,服務(wù)器驗(yàn)證用戶名和密碼付材,如果成功,以某種方式比如隨機(jī)生成32位的字符串作為token圃阳,存儲(chǔ)到服務(wù)器中厌衔,并返回token到APP,以后APP請(qǐng)求時(shí)限佩,凡是需要驗(yàn)證的地方都要帶上該token,然后服務(wù)器端驗(yàn)證token裸弦,成功返回所需要的結(jié)果祟同,失敗返回錯(cuò)誤信息,讓他重新登錄理疙。其中服務(wù)器上token設(shè)置一個(gè)有效期晕城,每次APP請(qǐng)求的時(shí)候都驗(yàn)證token和有效期。

那么我的問題來了:

1.服務(wù)器上的token存儲(chǔ)到數(shù)據(jù)庫中窖贤,每次查詢會(huì)不會(huì)很費(fèi)時(shí)砖顷。如果不存儲(chǔ)到數(shù)據(jù)庫,應(yīng)該存儲(chǔ)到哪里呢赃梧。

2.客戶端得到的token肯定要加密存儲(chǔ)的滤蝠,發(fā)送token的時(shí)候再解密。存儲(chǔ)到數(shù)據(jù)庫還是配置文件呢授嘀?

token是個(gè)易失數(shù)據(jù)物咳,丟了無非讓用戶重新登錄一下,新浪微博動(dòng)不動(dòng)就讓我重新登錄蹄皱,反正這事兒我是無所謂啦览闰。?所以如果你覺得普通的數(shù)據(jù)庫表撐不住了,可以放到MSSQL/MySQL 的內(nèi)存表里(不過據(jù)說mysql的內(nèi)存表性能提升有限)巷折,可以放到Memcache里(講真压鉴,這個(gè)是挺常見的策略),可以放到redis里(我做過這樣的實(shí)現(xiàn))锻拘,甚至可以放到OpenResty 的變量字典里(只要你有信心不爆內(nèi)存)油吭。

token是個(gè)憑條,不過它比門票溫柔多了,門票丟了重新花錢買上鞠,token丟了重新操作下認(rèn)證一個(gè)就可以了际邻,因此token丟失的代價(jià)是可以忍受的——前提是你別丟太頻繁,要是讓用戶隔三差五就認(rèn)證一次那就損失用戶體驗(yàn)了芍阎。

基于這個(gè)出發(fā)點(diǎn)世曾,如果你認(rèn)為用數(shù)據(jù)庫來保持token查詢時(shí)間太長(zhǎng),會(huì)成為你系統(tǒng)的瓶頸或者隱患谴咸,可以放在內(nèi)存當(dāng)中轮听。?比如memcached、redis岭佳,KV方式很適合你對(duì)token查詢的需求血巍。?這個(gè)不會(huì)太占內(nèi)存,比如你的token是32位字符串珊随,要是你的用戶量在百萬級(jí)或者千萬級(jí)述寡,那才多少內(nèi)存。?要是數(shù)據(jù)量真的大到單機(jī)內(nèi)存扛不住叶洞,或者覺得一宕機(jī)全丟風(fēng)險(xiǎn)大鲫凶,只要這個(gè)token生成是足夠均勻的,高低位切一下分到不同機(jī)器上就行衩辟,內(nèi)存絕對(duì)不會(huì)是問題螟炫。

客戶端方面這個(gè)除非你有一個(gè)非常安全的辦法,比如操作系統(tǒng)提供的隱私數(shù)據(jù)存儲(chǔ)艺晴,那token肯定會(huì)存在泄露的問題昼钻。比如我拿到你的手機(jī),把你的token拷出來封寞,在過期之前就都可以以你的身份在別的地方登錄然评。?解決這個(gè)問題的一個(gè)簡(jiǎn)單辦法?

1、在存儲(chǔ)的時(shí)候把token進(jìn)行對(duì)稱加密存儲(chǔ)狈究,用時(shí)解開沾瓦。?

2、將請(qǐng)求URL谦炒、時(shí)間戳贯莺、token三者進(jìn)行合并加簽名,服務(wù)端校驗(yàn)有效性宁改。?這兩種辦法的出發(fā)點(diǎn)都是:竊取你存儲(chǔ)的數(shù)據(jù)較為容易缕探,而反匯編你的程序hack你的加密解密和簽名算法是比較難的。然而其實(shí)說難也不難还蹲,所以終究是防君子不防小人的做法爹耗。話說加密存儲(chǔ)一個(gè)你要是被人扒開客戶端看也不會(huì)被噴明文存儲(chǔ)……?

方法1 它拿到存儲(chǔ)的密文解不開

方法2 它不知道你的簽名算法耙考,兩者可以結(jié)合使用。?

但是如果token被人拷走潭兽,他自然也能植入到自己的手機(jī)里面倦始,那到時(shí)候他的手機(jī)也可以以你的身份來用著,這你就瞎了山卦。?于是可以提供一個(gè)讓用戶可以主動(dòng)expire一個(gè)過去的token類似的機(jī)制鞋邑,在被盜的時(shí)候能遠(yuǎn)程止損。

在網(wǎng)絡(luò)層面上token明文傳輸?shù)脑挄?huì)非常的危險(xiǎn)账蓉,所以建議一定要使用HTTPS枚碗,并且把token放在post

body里。


附錄一铸本、關(guān)于Cookie的原理肮雨、作用,區(qū)別以及使用

1箱玷、cookie的作用:

我們?cè)跒g覽器中怨规,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄郵箱锡足,登錄一個(gè)頁面波丰。我們經(jīng)常會(huì)在此時(shí)設(shè)置30天內(nèi)記住我,或者自動(dòng)登錄選項(xiàng)舱污。那么它們是怎么記錄信息的呢呀舔,答案就是今天的主角cookie了弥虐,Cookie是由HTTP服務(wù)器設(shè)置的扩灯,保存在瀏覽器中,但HTTP協(xié)議是一種無狀態(tài)協(xié)議霜瘪,在數(shù)據(jù)交換完畢后珠插,服務(wù)器端和客戶端的鏈接就會(huì)關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接颖对。就像我們?nèi)コ匈I東西捻撑,沒有積分卡的情況下,我們買完東西之后缤底,超市沒有我們的任何消費(fèi)信息顾患,但我們辦了積分卡之后,超市就有了我們的消費(fèi)信息个唧。cookie就像是積分卡江解,可以保存積分,商品就是我們的信息徙歼,超市的系統(tǒng)就像服務(wù)器后臺(tái)犁河,http協(xié)議就是交易的過程鳖枕。


2、機(jī)制的區(qū)別:

session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案桨螺,而cookie機(jī)制則是在客戶端保持狀態(tài)的方案宾符,cookie又叫會(huì)話跟蹤機(jī)制。打開一次瀏覽器到關(guān)閉瀏覽器算是一次會(huì)話灭翔。說到這里魏烫,講下HTTP協(xié)議,前面提到缠局,HTTP協(xié)議是一種無狀態(tài)協(xié)議则奥,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會(huì)關(guān)閉狭园,每次交換數(shù)據(jù)都需要建立新的鏈接读处。此時(shí),服務(wù)器無法從鏈接上跟蹤會(huì)話唱矛。cookie可以跟蹤會(huì)話罚舱,彌補(bǔ)HTTP無狀態(tài)協(xié)議的不足。


3绎谦、cookie的分類:

cookie分為會(huì)話cookie和持久cookie管闷,會(huì)話cookie是指在不設(shè)定它的生命周期expires時(shí)的狀態(tài),前面說了窃肠,瀏覽器的開啟到關(guān)閉就是一次會(huì)話包个,當(dāng)關(guān)閉瀏覽器時(shí),會(huì)話cookie就會(huì)跟隨瀏覽器而銷毀冤留。當(dāng)關(guān)閉一個(gè)頁面時(shí)碧囊,不影響會(huì)話cookie的銷毀。會(huì)話cookie就像我們沒有辦理積分卡時(shí)纤怒,單一的買賣過程糯而,離開之后,信息則銷毀泊窘。

持久cookie則是設(shè)定了它的生命周期expires熄驼,此時(shí),cookie像商品一樣烘豹,有個(gè)保質(zhì)期瓜贾,關(guān)閉瀏覽器之后,它不會(huì)銷毀携悯,直到設(shè)定的過期時(shí)間祭芦。對(duì)于持久cookie,可以在同一個(gè)瀏覽器中傳遞數(shù)據(jù)蚌卤,比如实束,你在打開一個(gè)淘寶頁面登陸后奥秆,你在點(diǎn)開一個(gè)商品頁面,依然是登錄狀態(tài)咸灿,即便你關(guān)閉了瀏覽器构订,再次開啟瀏覽器,依然會(huì)是登錄狀態(tài)避矢。這就是因?yàn)閏ookie自動(dòng)將數(shù)據(jù)傳送到服務(wù)器端悼瘾,在反饋回來的結(jié)果。持久cookie就像是我們辦理了一張積分卡审胸,即便離開亥宿,信息一直保留,直到時(shí)間到期砂沛,信息銷毀烫扼。


4、簡(jiǎn)單的使用cookie的代碼

cookie的幾種常見屬性:document.cookie="key=value;expires=失效時(shí)間;path=路徑;domain=域名;secure;(secure表安全級(jí)別),

cookie以字符串的形式保存在瀏覽器中碍庵。下面貼段代碼出來映企,是一個(gè)類似購(gòu)物網(wǎng)站的將商品添加到購(gòu)物車,再?gòu)馁?gòu)物車還原商品信息的過程静浴,是自己用原生JS封裝的函數(shù)堰氓。

封裝的cookie的存入,讀取以及刪除的函數(shù):(這里是將信息以對(duì)象的形式存放到cookie中的苹享,會(huì)用到JSON的知識(shí))

具體代碼見鏈接:https://blog.csdn.net/u014753892/article/details/52821268

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末双絮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子得问,更是在濱河造成了極大的恐慌囤攀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭赋,死亡現(xiàn)場(chǎng)離奇詭異抚岗,居然都是意外死亡或杠,警方通過查閱死者的電腦和手機(jī)哪怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向抢,“玉大人认境,你說我怎么就攤上這事⌒” “怎么了叉信?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艘希。 經(jīng)常有香客問我硼身,道長(zhǎng)硅急,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任佳遂,我火速辦了婚禮营袜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丑罪。我一直安慰自己荚板,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布吩屹。 她就那樣靜靜地躺著跪另,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煤搜。 梳的紋絲不亂的頭發(fā)上免绿,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音擦盾,去河邊找鬼针姿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厌衙,可吹牛的內(nèi)容都是我干的距淫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼婶希,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼榕暇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喻杈,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤彤枢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后筒饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缴啡,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瓷们,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了业栅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谬晕,死狀恐怖碘裕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攒钳,我是刑警寧澤帮孔,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站不撑,受9級(jí)特大地震影響文兢,放射性物質(zhì)發(fā)生泄漏晤斩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一姆坚、第九天 我趴在偏房一處隱蔽的房頂上張望尸昧。 院中可真熱鬧,春花似錦旷偿、人聲如沸烹俗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幢妄。三九已至,卻和暖如春茫负,著一層夾襖步出監(jiān)牢的瞬間蕉鸳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工忍法, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潮尝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓饿序,卻偏偏與公主長(zhǎng)得像勉失,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子原探,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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