主要講token和jwt技術(shù),關(guān)于session和cookie文章很多。簡單提一下
現(xiàn)在一般都是session和cookie一起用,一起提。但是他們倆其實(shí)不是一定要在一起。
首先牢記一點(diǎn),http協(xié)議是無狀態(tài)的。就是說,一個(gè)請求過來,服務(wù)器不知道這個(gè)請求的用戶是不是已經(jīng)登錄過了,不知道他的狀態(tài)。只能再把這個(gè)請求重定向到登陸頁面。
這樣用戶就瘋了,怎么一直讓我登錄。
所以,前人想了一個(gè)辦法,在第一次登錄后,在服務(wù)器端記錄一個(gè)會話id(sessionId),記錄一下用戶及其狀態(tài)。然后把sessionId回給瀏覽器。瀏覽器將這個(gè)sessionId記錄到cookie里,下一次請求再帶上。這樣服務(wù)器從請求中拿到cookie里的sessionId,到自己的存儲(一般是用redis)里查一下,得到用戶的狀態(tài)。之后就可以愉快的進(jìn)行下面的操作了。
總之,
所以,在后臺進(jìn)行session的存儲和運(yùn)維這件事是非常重要和危險(xiǎn)的,對可靠性的要求非常高。
解決問題其實(shí)一直有兩條路,一是解決問題,二是解決問題本身。
那么,我們有沒有可能不存儲session呢?
其實(shí)是可以的。這樣來一步步思考:
下一次瀏覽器把加密后的token帶過來,服務(wù)器再使用相同的算法對數(shù)據(jù)進(jìn) 行一次加密,比較兩次加密的結(jié)果,相等即為驗(yàn)證通過。
因?yàn)樗借€只要服務(wù)器知道。所以用戶過來的請求是無法偽造的。
這樣一來,服務(wù)器不需要再費(fèi)力的保存session數(shù)據(jù)。服務(wù)器端是無狀態(tài)的。即使流量大增,只要增加服務(wù)器即可。
token的優(yōu)勢:
現(xiàn)在大部分你見到過的API和Web應(yīng)用都使用token。例如Facebook, Twitter, Google+, GitHub等。
我們知道了token技術(shù)是個(gè)好東西,那么我們怎么用呢?
JWT就是token的一種實(shí)現(xiàn)方式,并且基本是java web領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。
JWT全稱是JSON Web Token?;究梢钥闯鍪鞘褂肑SON格式傳輸token
JWT 由 3 部分構(gòu)成:
流程:
在基于 Token 進(jìn)行身份驗(yàn)證的的應(yīng)用程序中,用戶登錄時(shí),服務(wù)器通過Payload、Header和一個(gè)密鑰(secret)創(chuàng)建令牌(Token)并將 Token 發(fā)送給客戶端,
然后客戶端將 Token 保存在 Cookie 或者 localStorage 里面,以后客戶端發(fā)出的所有請求都會攜帶這個(gè)令牌。你可以把它放在 Cookie 里面自動(dòng)發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:Authorization: 你的Token。
Oauth 2.0 是一種授權(quán)機(jī)制,用來授權(quán)第三方應(yīng)用,獲取用戶數(shù)據(jù),它與 JWT 其實(shí)并不是一個(gè)層面的東西。Oauth2.0 是一個(gè)方便的第三方授權(quán)規(guī)范,而 JWT 是一個(gè) token 結(jié)構(gòu)規(guī)范。只是 JWT 常用來登陸鑒權(quán),而 Oauth2.0 在授權(quán)時(shí)也涉及到了登陸,所以就比較容易搞混。