跨域身份验证解决方案:JSON Web Token(JWT)

  1. 什么是 JWT ?
  2. JWT 生成原理
  3. JWT 与 OAuth 的区别
  4. JWT 问题和趋势

什么是 JWT ?

根据维基百科的定义,JSON WEB Token(JWT,读作 [/dʒɒt/]),是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。

JWT 生成原理

头信息指定了该JWT使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'

HS256 表示使用了 HMAC-SHA256 来生成签名。
消息体包含了JWT的意图:

payload = '{"loggedInAs":"admin","iat":1422779638}'//iat表示令牌生成的时间

未签名的令牌由base64url编码的头信息和消息体拼接而成(使用”.”分隔),签名则通过私有的key计算而成:

key = 'secretkey'  
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)  
signature = HMAC-SHA256(key, unsignedToken)

最后在未签名的令牌尾部拼接上base64url编码的签名(同样使用”.”分隔)就是JWT了:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) 

# token看起来像这样: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

JWT常常被用作保护服务端的资源(resource),客户端通常将JWT通过HTTP的Authorization header发送给服务端,服务端使用自己保存的key计算、验证签名以判断该JWT是否可信:

Authorization: Bearer eyJhbGci*...<snip>...*yu5CSpyHI

JWT 与 OAuth 的区别

  • OAuth2 是一种授权框架 ,JWT 是一种认证协议
  • 无论使用哪种方式切记用 HTTPS 来保证数据的安全性
  • OAuth2 用在使用第三方账号登录的情况(比如使用 weibo, qq, github 登录某个 app ),而 JWT 是用在前后端分离, 需要简单的对后台 API 进行保护时使用。

JWT 问题和趋势

1、JWT 默认不加密,但可以加密。生成原始令牌后,可以使用该令牌再次对其进行加密。

2、当 JWT 未加密方法时,一些私密数据无法通过 JWT 传输。

3、JWT 不仅可用于认证,还可用于信息交换。善用 JWT 有助于减少服务器请求数据库的次数。

4、JWT 的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦 JWT 签发,在有效期内将会一直有效。

5、JWT 本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT 的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。

6、为了减少盗用和窃取,JWT 不建议使用 HTTP 协议来传输代码,而是使用加密的 HTTPS 协议进行传输

我想在项目中做用户身份验证,应该使用 JWT 吗? 点击这里查看这篇文章
转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:跨域身份验证解决方案:JSON Web Token(JWT)

字数:716

本文作者:夏来风

发布时间:2021-04-09, 23:58:36

原始链接:http://www.demo1024.com/blog/java-jwt/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。