關(guān)于JWT與cookie和token的區(qū)別說明
一. cookie
A)cookie如何認(rèn)證
1.用戶輸入用戶名與密碼,發(fā)送給服務(wù)器。
2.服務(wù)器驗(yàn)證用戶名和密碼,正確的就創(chuàng)建一個(gè)會(huì)話(session),同時(shí)會(huì)把這個(gè)會(huì)話的ID保存到客戶端瀏覽器中,因?yàn)楸4娴牡胤绞菫g覽器的cookie,所以這種認(rèn)證方式叫做基于cookie的認(rèn)證方式。
3.后續(xù)的請(qǐng)求中,瀏覽器會(huì)發(fā)送會(huì)話ID到服務(wù)器,服務(wù)器上如果能找到對(duì)應(yīng)的ID的會(huì)話,那么服務(wù)器就會(huì)返回需要的數(shù)據(jù)給瀏覽器。
4.當(dāng)用戶退出登錄,會(huì)話會(huì)同時(shí)在客戶端和服務(wù)器端被銷毀。
B)cookie認(rèn)證方式的不足之處
1.服務(wù)器要為每個(gè)用戶保留session信息,連接用戶過多會(huì)造成服務(wù)器內(nèi)存壓力過大。
2.適合單一域名,不適合第三方請(qǐng)求。
二. token
A)token的認(rèn)證過程
1.用戶輸入用戶名和密碼,發(fā)送給服務(wù)器。
2.服務(wù)器驗(yàn)證用戶名和密碼,正確的話就返回一個(gè)簽名過的token(token 可以認(rèn)為就是個(gè)長長的字符串),瀏覽器客戶端拿到這個(gè)token。
3.后續(xù)每次請(qǐng)求中,瀏覽器會(huì)把token作為http header發(fā)送給服務(wù)器,服務(wù)器驗(yàn)證簽名是否有效,如果有效那么認(rèn)證就成功,可以返回客戶端需要的數(shù)據(jù)。
4.一旦用戶退出登錄,只需要客戶端銷毀token即可,服務(wù)器端不需要任何操作。
B)token認(rèn)證方式的特點(diǎn)
這種方式的特點(diǎn)就是客戶端的token中自己保留有大量信息,服務(wù)器沒有存儲(chǔ)這些信息,而只負(fù)責(zé)驗(yàn)證,不必進(jìn)行數(shù)據(jù)庫查詢,執(zhí)行效率大大提高。
三. JWT
A)JWT介紹
1.JWT是json web token縮寫。它將用戶信息加密到token里,服務(wù)器不保存任何用戶信息。服務(wù)器通過使用保存的密鑰驗(yàn)證token的正確性,只要正確即通過驗(yàn)證。
2.優(yōu)點(diǎn)是在分布式系統(tǒng)中,很好地解決了單點(diǎn)登錄問題,很容易解決了session共享的問題。jwt長度較小,且可以使用URL傳輸(URLsafe)。不想cookies只能在web環(huán)境起作用。 JWT可以同時(shí)使用在web環(huán)境和RESTfull的接口。
缺點(diǎn)是無法作廢已頒布的令牌/不易應(yīng)對(duì)數(shù)據(jù)過期。
B)JWT組成
JWT包含三個(gè)部分: Header頭部,Payload負(fù)載和Signature簽名。由三部分生成token,三部分之間用“.”號(hào)做分割。
列如 :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1.Header
在Header中通常包含了兩部分:type:代表token的類型,這里使用的是JWT類型。 alg:使用的Hash算法,例如HMAC SHA256或RSA.
{ “alg”: “HS256”, “typ”: “JWT” }
這會(huì)被經(jīng)過base64Url編碼形成第一部分
2.Payload
token的第二個(gè)部分是荷載信息,它包含一些聲明Claim(實(shí)體的描述,通常是一個(gè)User信息,還包括一些其他的元數(shù)據(jù))
聲明分三類:
1)Reserved Claims,這是一套預(yù)定義的聲明,并不是必須的,這是一套易于使用、操作性強(qiáng)的聲明。包括:iss(issuer)、exp(expirationtime)、sub(subject)、aud(audience)等
2)Plubic Claims,
3)Private Claims,交換信息的雙方自定義的聲明
{ “sub”: “1234567890”, “name”: “John Doe”, “admin”: true }
同樣經(jīng)過Base64Url編碼后形成第二部分
3.signature
使用header中指定的算法將編碼后的header、編碼后的payload、一個(gè)secret進(jìn)行加密。
例如使用的是HMAC SHA256算法,大致流程類似于: HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)
這個(gè)signature字段被用來確認(rèn)JWT信息的發(fā)送者是誰,并保證信息沒有被修改
C)為什么要使用JWT
相比XML格式,JSON更加簡潔,編碼之后更小,這使得JWT比SAML更加簡潔,更加適合在HTML和HTTP環(huán)境中傳遞。
在安全性方面,SWT只能夠使用HMAC算法和共享的對(duì)稱秘鑰進(jìn)行簽名,而JWT和SAML
token則可以使用X.509認(rèn)證的公私秘鑰對(duì)進(jìn)行簽名。與簡單的JSON相比,XML和XML數(shù)字簽名會(huì)引入復(fù)雜的安全漏洞。
因?yàn)镴SON可以直接映射為對(duì)象,在大多數(shù)編程語言中都提供了JSON解析器,而XML則沒有這么自然的文檔-對(duì)象映射關(guān)系,這就使得使用JWT比SAML更方便
java json web token工具類
D)JWT的Maven引入
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別
代理模式在我們生活中很常見,而Java中常用的兩個(gè)的代理模式就是動(dòng)態(tài)代理與靜態(tài)代理,這篇文章主要為大家介紹了二者的應(yīng)用與區(qū)別,需要的可以參考下2023-08-08基于java+springboot+mybatis+laiyu實(shí)現(xiàn)學(xué)科競賽管理系統(tǒng)
這篇文章主要介紹了基于java+springboot+mybatis+laiyu實(shí)現(xiàn)的學(xué)科競賽管理系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09java簡單實(shí)現(xiàn)復(fù)制 粘貼 剪切功能代碼分享
本文給大家分享了一段java編寫的簡單實(shí)現(xiàn)復(fù)制粘貼剪切功能的代碼,需要的小伙伴可以直接拿走使用。如有更好的方案,也可以告之本人。2014-11-11SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊的相關(guān)資料,有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-06-06Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線蛋糕銷售商城的實(shí)現(xiàn)
這是一個(gè)使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的在線蛋糕銷售商城,是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有線上蛋糕商城該有的所有功能,感興趣的朋友快來看看吧2022-01-01quartz定時(shí)執(zhí)行任務(wù),并配置web.xml的操作方法
下面小編就為大家?guī)硪黄猶uartz定時(shí)執(zhí)行任務(wù),并配置web.xml的操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Redis原子計(jì)數(shù)器incr,防止并發(fā)請(qǐng)求操作
這篇文章主要介紹了Redis原子計(jì)數(shù)器incr,防止并發(fā)請(qǐng)求操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11java.lang.NumberFormatException異常解決方案詳解
這篇文章主要介紹了java.lang.NumberFormatException異常解決方案詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08