JWT学习

See https://jwt.io/introduction for details
json web token是什么?
JSON Web Token(JWT) 是一个开源的标准(RFC 7519 https://www.rfc-editor.org/rfc/rfc7519)定义了一个紧凑且独立的方式用于端和端之间安全传输JSON对象。由于数字签名的存在,表名信息是被验证且能够相信的。
JWTs使用密钥(通过HMAC算法)或一对 公钥和私钥使用RSA或ECDSA算法来签名.。
虽然JWTs 能够通过加密去提供端和端之间的保密,但是我们将关注签名令牌。签名令牌能保证声明的完整性,而加密令牌对于其它端隐藏了这些声明。当令牌被用于公钥私钥时,签名能验证持有私钥的一方才能签名。

什么时候使用JWTs
下面列举一些JWTs常用的场景:
Authorizatoin: 是JWT最常见的场景。当一个用户登录后,随后的每一个请求都将包含JWT,允许用户访问其token对应权限的资源。
现在(Single Sign On)单点登录也广泛使用JWT,因为它的头部很小而且能够轻松跨域。

Information Exchange:JWT是一个好的方式用于端之间安全的传输信息。因为JWTs的签名,例如:你能确保发送者是谁,另外,签名也计算了头部和负载的大小,接收方能验证内容是否被篡改

JTW的结构是什么样的?
规定形式,JWT被.用三个部分分割开:Header、Payload、Signature;因此 一个典型的JWT看起来像xxxxx.yyyyyy.zzzzz的格式。让我们逐一解释:

Header:包含了两个部分:令牌的类型和签名使用的算法,通常使用HMAC SHA256或RSA. 然后下面的json经过Base64Url编码形成JWT第一部分。
{"alg":"HS256","type":"JWT"}
Payload: 令牌的第二部分,包含了声明。声明包含了用户实体(端用户)和附加的数据。有三种类型的声明:registered,public,private
registered cliams:一组预定义的声明不是强制性的 但推荐使用的,提供一系列可用的、交互的声明。如 iss(issuer),exp(expiration time),sub(subject),aud(audience)等等.

tip: 声明的名字 都是3个字符 因为JWT的紧凑性.
public cliams: 被使用jwt的人定义.但是为了避免冲突,应该在IANA JSON Web(https://www.iana.org/assignments/jwt/jwt.xhtml)令牌注册表中定义它们,或者定义为包含抗冲突命名空间的URI。

private cliams:端和端之间自定义的用于分享信息.

eg:{"sub":"1234567890","name":"John Doe","admin":true}
json经过Base64Url编码形成JWT第二部分.

tip:注意签名令牌的信息 虽然受保护不被修改,但能被任何人读取。不要把一些私密信息放在payload或者header,除非进行了加密.

Signature: 签名部分 由header编码、payload编码、一个密钥并且使用指定的算法然后进行签名。
eg: 使用HMAC SHA256算法 HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
签名用于信息不会被篡改,如果加入了私钥 也可以验证发送者的身份。

总结一下就是 3个Base64-URL字符串被.进行了分割,能容易的在html和http环境中进行传输.
eg:eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9
.eyJleHAiOjE2NjMxNjgwNjQsImRhdGEiOnsiaWQiOjI0LCJjcmVhdGVkX2F0IjoiMjAyMi0wOS0xNFQwNDoyMjoyMS45NzkxNjhaIiwidXBkYXRlZF9hdCI6IjIwMjItMDktMTRUMDQ6MjI6MjEuOTc5MTY4WiIsImJyYW5kX2lkIjoxLCJicmFuZF9uYW1lIjoi5rWL6K-VIiwidXNlcm5hbWUiOiJjYWl3dSIsInBhc3N3b3JkIjoiIiwicm9sZV9pZCI6NSwicm9sZV9uYW1lIjoi6LSi5YqhIiwibGV2ZWxfaWQiOjAsImxldmVsX25hbWUiOiIiLCJzdGF0dXMiOjAsInBvaW50cyI6MCwiaW52aXRlcl9pZCI6MX19 .gAEUhOln9Id7Cio1A0FLtJrWhicoJ9VzsXEdvuJPUhNnhGUB7YaRV2GXDtf5HV3wdcv0BBoz9ImLj9_BGlq-DA

实践地址 :

https://jwt.io/#debugger-io

JWT是如何工作的?
身份验证时,当用户使用凭证成功登录后,一个JWT将会被返回.因为token是凭证,因此必须关心其安全问题。通常,不应该使token的时效超过其使用的时效(token过期时间)
由于安全性的缺乏,也不应该在浏览器中存储一些敏感数据.

无论什么时候用户想要访问一个受保护的路线或资源,用户代理应该携带JWT,在头部的Authorization字段 使用Bearer 模式。eg: Authorization: Bearer
在某些情况下,这可能是一种无状态授权机制.服务器的常规保护会检查Authorization 里的token字段,如果存在,用户将有权限进行访问。如果JWT包含了必须的资源,为某些操作查询数据库的需求可能会减少,尽管情况不一定总是如此.

注意 如果通过http请求头发送JWT token,应该保证它尽可能的小.一些服务器不会接收 头部超过8KB的请求.如果你想在JWT里内嵌很多信息,像包括用户可能的权限,你可能需要一个可选的情况,像https://auth0.com/developers/lab/fine-grained-authorization

如果token在Authorization字段,CORS(Cross-Origin Resource Sharing)不会因为没有使用cookie变成问题

tip:签名令牌,token包含的所有信息将会暴露给用户和其他端,即使他们不能作出修改.意味着你不能将一些隐私的信息放到token里面.

为什么我们使用JWT?
接下来讨论了JWT相较于Simple Web Tokens(swt)和Security Assertion Markup Language Tokens(SAML)的优势.

·JSON是简单的相较于XML,编码之后json更小且紧凑相较于SAML,使得JWT是一个好的选择用于HTML和HTTP环境中传递.
·更安全,SWT只能使用共享密钥使用HMAC算法实现对称签名.然而,JWT和SAML使用公钥私钥(非对称密钥加密)通过X.509证书进行签名.
·JSON解析在编程中是十分常见的因为能直接隐射到对象.相反,XML没有本地方法实现文档->对象的映射.使得用JWT工作更简单.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值