成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

大話javascript 7期:Cookie、Session和Token的那些事兒

tianren124 / 2136人閱讀

摘要:服務(wù)器檢查該,以此來(lái)辨認(rèn)用戶狀態(tài)。如果為,表示刪除該。防篡改簽名服務(wù)器為每個(gè)項(xiàng)生成簽名。服務(wù)端根據(jù)接收到的內(nèi)容和簽名,校驗(yàn)內(nèi)容是否被篡改。算法得到的簽名和請(qǐng)求中數(shù)據(jù)的簽名不一致,則證明數(shù)據(jù)被篡改。

一、登錄認(rèn)證機(jī)制
隨著互聯(lián)網(wǎng)的不斷發(fā)展,無(wú)論是網(wǎng)站還是app,一般都會(huì)要求用戶注冊(cè)/登錄。主要的登錄方式有賬戶密碼登錄、第三方登錄(微信登錄、QQ登錄、微博登錄等)

登錄可分為三個(gè)階段(登錄驗(yàn)證、登錄持續(xù)、退出登錄);
登錄驗(yàn)證指客戶端提供賬號(hào)/密碼(或第三方平臺(tái)(微信、qq)獲取openid/unionid)向服務(wù)器提出登錄請(qǐng)求,服務(wù)器應(yīng)答請(qǐng)求判斷能否登錄并返回相應(yīng)數(shù)據(jù);
登錄持續(xù)指客戶端登錄后, 服務(wù)器能夠分辨出已登錄的客戶端,并為其持續(xù)提供登錄權(quán)限的服務(wù)器。
退出登錄指客戶端退出登錄狀態(tài)。

二、保持登錄持續(xù)狀態(tài)的實(shí)現(xiàn)方式 為什么要保持登錄狀態(tài)的持續(xù)?

由于HTTP是一種無(wú)狀態(tài)的協(xié)議,服務(wù)器單從網(wǎng)絡(luò)連接上無(wú)從知道客戶身份。怎么辦呢?就給客戶端們頒發(fā)一個(gè)通行證吧,每人一個(gè),無(wú)論誰(shuí)訪問(wèn)都必須攜帶自己通行證

方案:客戶端登錄成功后, 服務(wù)器為其分配一個(gè)唯一的憑證, 客戶端每次請(qǐng)求資源時(shí)都帶上這個(gè)憑證;

實(shí)現(xiàn)方案

cookie 會(huì)話機(jī)制

session 會(huì)話機(jī)制

token 會(huì)話機(jī)制

三、Cookie、Session和Token Cookie(瀏覽器緩存) 1.什么是Cookie

Cookie實(shí)際上是一小段的文本信息。客戶端請(qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie。客戶端瀏覽器會(huì)把Cookie保存起來(lái)。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來(lái)辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容。

cookie其實(shí)是補(bǔ)充http協(xié)議的無(wú)狀態(tài)性的缺點(diǎn),底層是通過(guò)服務(wù)器端在http響應(yīng)消息中增加set-cookie字段來(lái)將cookie信息發(fā)送給瀏覽器端,因?yàn)樗荒艽?k,一般用來(lái)存瀏覽器的身份信息,瀏覽器在訪問(wèn)服務(wù)器的某些資源的時(shí)候,會(huì)在http請(qǐng)求頭中將cookie數(shù)據(jù)傳給服務(wù)器,這樣服務(wù)器就知道是誰(shuí)請(qǐng)求的了,但是如果用戶清除了cookie,那就啥都沒(méi)有了

2.Cookie的屬性

1、Expires:該Cookie失效的時(shí)間,單位秒。

如果為正數(shù),則該Cookie在maxAge秒之后失效(持久級(jí)別Cookie)。

如果為負(fù)數(shù),該Cookie為臨時(shí)Cookie,關(guān)閉瀏覽器即失效(會(huì)話級(jí)別Cookie),瀏覽器也不會(huì)以任何形式保存該Cookie。

如果為0,表示刪除該Cookie。默認(rèn)為–1;

2、Domain:
我們現(xiàn)在有二個(gè)域名。域名A:b.f.com,域名B:d.f.com;顯然域名A和域名B都是f.com的子域名

如果我們?cè)谟蛎鸄中的Cookie的domain設(shè)置為.f.com,那么.f.com及其子域名都可以獲取這個(gè)Cookie,即域名A和域名B都可以獲取這個(gè)Cookie

如果域名A沒(méi)有顯式設(shè)置Cookie的domain方法,那么domain就為.b.f.com,不一樣的是,這時(shí),域名A的子域名將無(wú)法獲取這個(gè)Cookie

HttpOnly: 這個(gè)屬性是面試的時(shí)候??嫉模绻@個(gè)屬性設(shè)置為true,就不能通過(guò)js腳本來(lái)獲取cookie的值,能有效的防止xss攻擊

3.Cookie的操作

封裝cookie的常用操作方法

設(shè)置cookie

讀取cookie

刪除cookie

var cookieUtil = {
    getItem: function (name) {
        var cookieName = encodeURIComponent(name) + "=",
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null;
        if (cookieStart > -1) {
            var cookieEnd = document.cookie.indexOf(";", cookieStart);
            if (cookieEnd == 1) {
                cookieEnd = document.cookie.length;
            }
            cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd))
        }
        return cookieValue;
    },
    setItem: function (name, value, expires, path, domain, secure) {
        var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
        if (expires) {
            cookieText += ";expires=" + expires.toGMTString();
        }
        if (path) {
            cookieText += ";path=" + path;
        }
        if (domain) {
            cookieText += ";domain=" + domain;
        }
        if (secure) {
            cookieText += ";secure";
        }
        document.cookie = cookieText;
    },
    unset: function (name, path, domain, secure) {
        this.setItem(name, "", new Date(0), path, domain, secure)
    }
}
CookieUtil.setItem("name", "tom"); // 設(shè)置cookie
console.log(CookieUtil.getItem("name"));//讀取cookie
CookieUtil.unset("name")//刪除cookie
4.Cookie防篡改機(jī)制
因?yàn)镃ookie是存儲(chǔ)在客戶端,用戶可以隨意修改。所以,存在一定的安全隱患。
防篡改簽名:服務(wù)器為每個(gè)Cookie項(xiàng)生成簽名。如果用戶篡改Cookie,則與簽名無(wú)法對(duì)應(yīng)上。以此,來(lái)判斷數(shù)據(jù)是否被篡改。

原理如下:

服務(wù)端提供一個(gè)簽名生成算法secret

根據(jù)方法生成簽名secret(wall)=34Yult8i

將生成的簽名放入對(duì)應(yīng)的Cookie項(xiàng)username=wall|34Yult8i。其中,內(nèi)容和簽名用|隔開。

服務(wù)端根據(jù)接收到的內(nèi)容和簽名,校驗(yàn)內(nèi)容是否被篡改。

舉個(gè)栗子:
比如服務(wù)器接收到請(qǐng)求中的Cookie項(xiàng)username=pony|34Yult8i,然后使用簽名生成算法secret(pony)=666。 算法得到的簽名666和請(qǐng)求中數(shù)據(jù)的簽名不一致,則證明數(shù)據(jù)被篡改。

Session(會(huì)話) 1.什么是session
session是一種服務(wù)器機(jī)制,是存儲(chǔ)在服務(wù)器上的信息,主要配合cookie完成瀏覽器的身份認(rèn)證和狀態(tài)存儲(chǔ)方式多種多樣,可以是服務(wù)器的內(nèi)存中,或者是mongo數(shù)據(jù)庫(kù),redis內(nèi)存數(shù)據(jù)庫(kù)中。為了獲得更高的存取速度,服務(wù)器一般把Session放在內(nèi)存里。每個(gè)用戶都會(huì)有一個(gè)獨(dú)立的Session。如果Session內(nèi)容過(guò)于復(fù)雜,當(dāng)大量客戶訪問(wèn)服務(wù)器時(shí)可能會(huì)導(dǎo)致內(nèi)存溢出。因此,Session里的信息應(yīng)該盡量精簡(jiǎn)。

Session相對(duì)于cookie較安全點(diǎn),當(dāng)用戶請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器會(huì)把數(shù)據(jù)臨時(shí)存下來(lái),如果退出網(wǎng)站后,session會(huì)被銷毀。

Session是基于cookie實(shí)現(xiàn)的,瀏覽器第一次訪問(wèn)服務(wù)器時(shí),服務(wù)器創(chuàng)建一個(gè)Session,同時(shí)生成一個(gè)唯一的會(huì)話key,即sessionID。接著sessionIDsession分別作為keyvalue保存到緩存中,也可以保存到數(shù)據(jù)庫(kù)中,然后服務(wù)器把sessionID通過(guò)set-cookie的方式寫入瀏覽器,瀏覽器下次訪問(wèn)服務(wù)器時(shí)直接攜帶上cookie中的sessionID,服務(wù)器再根據(jù)sessionID找到對(duì)應(yīng)的session進(jìn)行匹配,來(lái)判斷用戶是否登錄

2.session鑒權(quán)過(guò)程

【1】 客戶端發(fā)起登錄請(qǐng)求,服務(wù)器端創(chuàng)建session,并通過(guò)set-cookie將生成的sessionID寫入的客戶端的cookie中。
【2】 在發(fā)起其他需要權(quán)限的接口的時(shí)候,客戶端的請(qǐng)求體的Header部分會(huì)攜帶sessionID發(fā)送給服務(wù)端。然后根據(jù)這個(gè)sessionId去找服務(wù)器端保存的該客戶端的session,然后判斷該請(qǐng)求是否合法。

3.cookie和session的區(qū)別

Token(身份令牌) 1.什么是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,避免多次查庫(kù)

瀏覽器第一次訪問(wèn)服務(wù)器,根據(jù)傳過(guò)來(lái)的唯一標(biāo)識(shí)userId,服務(wù)端會(huì)通過(guò)一些算法,如常用的HMAC-SHA256算法,然后加一個(gè)密鑰,生成一個(gè)token,然后通過(guò)BASE64編碼一下之后將這個(gè)token發(fā)送給客戶端;客戶端將token保存起來(lái),下次請(qǐng)求時(shí),帶著token,服務(wù)器收到請(qǐng)求后,然后會(huì)用相同的算法和密鑰去驗(yàn)證token,如果通過(guò),執(zhí)行業(yè)務(wù)操作,不通過(guò),返回不通過(guò)信息;

2.token生成方式

瀏覽器第一次訪問(wèn)服務(wù)器時(shí),服務(wù)器根據(jù)傳過(guò)來(lái)的唯一標(biāo)識(shí)userId,通過(guò)一些算法,加一個(gè)密鑰,生成一個(gè)token,接著通過(guò)base64編碼將token返回給客戶端。客戶端將token保存起來(lái),下次請(qǐng)求時(shí)需要帶著token,服務(wù)器收到請(qǐng)求后,用相同的算法和密鑰去驗(yàn)證token

3.token和session的區(qū)別

token和session其實(shí)都是為了身份驗(yàn)證,session一般翻譯為會(huì)話,而token更多的時(shí)候是翻譯為令牌;
session服務(wù)器會(huì)保存一份,可能保存到緩存,文件,數(shù)據(jù)庫(kù);同樣,session和token都是有過(guò)期時(shí)間一說(shuō),都需要去管理過(guò)期時(shí)間;
其實(shí)token與session的問(wèn)題是一種時(shí)間與空間的博弈問(wèn)題,session是空間換時(shí)間,而token是時(shí)間換空間。兩者的選擇要看具體情況而定。
雖然確實(shí)都是“客戶端記錄,每次訪問(wèn)攜帶”,但 token 很容易設(shè)計(jì)為自包含的,也就是說(shuō),后端不需要記錄什么東西,每次一個(gè)無(wú)狀態(tài)請(qǐng)求,每次解密驗(yàn)證,每次當(dāng)場(chǎng)得出合法 /非法的結(jié)論。這一切判斷依據(jù),除了固化在 CS 兩端的一些邏輯之外,整個(gè)信息是自包含的。這才是真正的無(wú)狀態(tài)。
而 sessionid ,一般都是一段隨機(jī)字符串,需要到后端去檢索 id 的有效性。萬(wàn)一服務(wù)器重啟導(dǎo)致內(nèi)存里的 session 沒(méi)了呢?萬(wàn)一 redis 服務(wù)器掛了呢?

sessionID是基于cookie實(shí)現(xiàn)的,而token不需要基于cookie。這就導(dǎo)致了sessionID只能用在瀏覽器上,對(duì)于原生的應(yīng)用無(wú)法實(shí)現(xiàn)。原生的應(yīng)用是不具備cookie的特性的。另外sessionID可以實(shí)現(xiàn)服務(wù)端注銷會(huì)話,而token不能(當(dāng)然你可以把用戶登陸的token存入到redis中,但是不推薦token入庫(kù))

4.token的優(yōu)點(diǎn)

Token作為用戶認(rèn)證的處理方式,有幾個(gè)優(yōu)點(diǎn):

無(wú)狀態(tài),可擴(kuò)展:不會(huì)在服務(wù)端存儲(chǔ)用戶的登錄狀態(tài),可以很容易的實(shí)現(xiàn)服務(wù)器的增減

支持移動(dòng)設(shè)備,對(duì)多類型客戶端的支持良好

支持跨程序調(diào)用,各個(gè)接口之間的調(diào)用更方便

安全可靠

5.什么是JSON Web Token
JSON web Token,簡(jiǎn)稱JWT,本質(zhì)是一個(gè)token,是一種緊湊的URL安全方法,用于在網(wǎng)絡(luò)通信的雙方之間傳遞。一般放在HTTP的headers參數(shù)里面的authorization里面,值的前面加Bearer關(guān)鍵字和空格。除此之外,也可以在url和request body中傳遞。

Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場(chǎng)景。JWT的聲明一般被用來(lái)在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。

如果你覺(jué)得這篇文章對(duì)你有所幫助,那就順便點(diǎn)個(gè)贊吧,點(diǎn)點(diǎn)關(guān)注不迷路~

黑芝麻哇,白芝麻發(fā),黑芝麻白芝麻哇發(fā)哈!

前端哇發(fā)哈

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103598.html

相關(guān)文章

  • 登錄那些事兒

    摘要:假如是在同一個(gè)域名下,例如與,因?yàn)樵试S設(shè)置到二級(jí)域名下,所以和是可以共享的,用戶的信息可以通過(guò)可逆加密放在二級(jí)域名下的,并且設(shè)置,就可以一站登錄,站站登錄。 原文鏈接:BlueSun | 登錄那些事兒 也不知道是什么原因,剛開始不久的職業(yè)生涯,在技術(shù)這條路走著走著,和「登錄」總是有著一個(gè)不解之緣。還記得當(dāng)初學(xué)習(xí)Web編程的時(shí)候么?不管是Java、.Net、PHP,繼經(jīng)典「Hello W...

    layman 評(píng)論0 收藏0
  • 大話javascript 5:跨域

    摘要:同源策略所謂同源是指協(xié)議,域名,端口均相同。同源策略是瀏覽器的一個(gè)安全功能,不同源的客戶端腳本在沒(méi)有明確授權(quán)的情況下,不能讀寫對(duì)方資源。需注意的是由于同源策略的限制,所讀取的為跨域請(qǐng)求接口所在域的,而非當(dāng)前頁(yè)。 一、什么是跨域 1.URL解析 URL (Uniform Resource Locator )統(tǒng)一資源定位符(URL)是用于完整地描述Internet上網(wǎng)頁(yè)和其他資源的地址的...

    jzzlee 評(píng)論0 收藏0
  • 詳解 Cookie,Session,Token

    摘要:由于是存在客戶端上的,所以瀏覽器加入了一些限制確保不會(huì)被惡意使用,同時(shí)不會(huì)占據(jù)太多磁盤空間。簽名是對(duì)前兩部分的簽名,防止數(shù)據(jù)被篡改。的作用最開始的初衷是為了實(shí)現(xiàn)授權(quán)和身份認(rèn)證作用的,可以實(shí)現(xiàn)無(wú)狀態(tài),分布式的應(yīng)用授權(quán)。 前言 無(wú)狀態(tài)的HTTP協(xié)議 很久很久之前, Web基本都是文檔的瀏覽而已。既然是瀏覽, 作為服務(wù)器, 不需要記錄在某一段時(shí)間里都瀏覽了什么文檔, 每次請(qǐng)求都是一個(gè)新的HT...

    Allen 評(píng)論0 收藏0
  • [聊一聊系列]聊一聊前端存儲(chǔ)那些事兒

    摘要:如圖圖顧名思義,,是級(jí)別的存儲(chǔ)。如筆者寫的一篇淺析文章聊一聊百度移動(dòng)端首頁(yè)前端速度那些事兒讀者們可以嘗試使用。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://segmentfault.com/blog/frontenddriver 在web開發(fā)越來(lái)越復(fù)雜的今天,前端擁有的能力也越來(lái)越多。其中最重要的一項(xiàng)莫過(guò)于web存儲(chǔ)。...

    caige 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<