​JWT(Json Web
Token)定义了平等种下Json形式以网之中安全地传递信息的简开放之专业(RFC
7519)。JWT使用数字签名确保信息是可信的。

一、Session认证和Token认证
Http协议本身是不管状态的,如果用户为服务器传递了用户称和密码进行了用户征,那么下同样糟糕呼吁时用户还是要开展同样的证实,因为根据Http协议,我们鞭长莫及清楚要是由于何人用户产生的。所以,为了能够辨识谁用户,免去每次都开展认证的劳动,就发生了风的Session认证与token认证方案。

a) Session认证
Session认证的方案吗:第一破用户征要通过时,服务器端存储用户的报到信息,然后于应时传递给浏览器,浏览器保存也cookie,下次呼吁时把cookie发送给服务器,服务器根据cookie信息来分辨是哪位用户。
Session认证适用于单个服务器的场所,如果用户增加,需要安排多只服务器时,Session认证就见面暴露问题。因为每个用户以证实后,服务器都见面记录Session,一般保存在内存中,随着认证用户多,服务器出啊会叠加;而且认证用户的接轨要都要交这大保存了和谐Session的服务器上验证Cookie。在差不多集群分布式的场地,这即招了性能瓶颈,对负荷均衡、应用之扩充都见面造成影响。
经过外Session通过以Session保存在数据库或硬盘中得化解服务器内存开销的问题,但仍然不便宜扩展。

b) Token认证
Token认证为是任状态的,不需以服务端保存认证用户的消息,它的证明流程也:用户采取用户名密码请求服务器;服务器验证用户,如果证明通过就关用户一个token;客户端保存token,并当事后的历次要都屈居token;服务端验证token、返回数据。
Token认证机制不欲保留认证用户之音、也未待考录用户在那台服务器登录,可以非常好地服以之扩展。
token的体积十分有些,请求服务端时,可以被附在URL、Header或是Post参数中。而且token中包含了用户相关的必需、非私密的相信,免去了服务端再次查询数据库的支付。

 

c) JWT的动状况

最常用于对已经报到用户的印证,比如单点登录,只待于历次要被还附上JWT,JWT体积小巧且支持跨域、多语言。
JWT也可用来信息传输,因为有根据payload和header计算出的签名的保护,可以包传递的消息不吃曲解。

三、JWT的构成
JWT由Header、Payload、Signature三片段构成,之间为此点号风格,构成xx.yy.zz的花样。
a) Header声明了token类型、算法类型(HMAC SHA256要RSA),比如
{
  “alg”: “HS256”,
  “typ”: “JWT”
}
然后对header做Base64URL编码。
b)
Payload中保存了声称信息,声明信息来规范声明、公开声明、自定义声明三种植类型,前片种声明在相关的正经被就规定https://www.iana.org/assignments/jwt/jwt.xhtml,推荐但不强制使用,标准声明举例有:

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的超时时,这个过期时空得要过签发时间
nbf: 定义在啊日子前,该jwt都是休可用之.
iat: jwt的签发时间
jti: jwt的绝无仅有身份标识,主要用以当一次性token,从而回避重放攻击
发送方和接收方也得以自自然声明。
{
  “sub”: “1234567890”,
  “name”: “John Doe”,
  “admin”: true
}
载荷信息呢下Base64URL编码。

c)
Signature,签证信息是依据Header、Payload的Base64URL编码以及密钥(Secret)加密生成的,加密算法使用header中定义之类。

d) Secret信息就保证存在服务端,服务端为客户端签发jwt
token要运Secret,后续对客户端递交的jwt的证实也只要以Secret,所以毫无疑问要是防止Secret的泄露。

四、JWT的使用

var secret = “h3h5k9kll789”;
//JWT签发
var payload = new Dictionary<string, object>
{
  { “UserID”,123},
  {“UserName”,”admin” }
};
//指定HMAC加密算法
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer,
urlEncoder);
var token = encoder.Encode(payload, secret);

//JWT验证及分析
IJsonSerializer serializer1 = new JsonNetSerializer();
IDateTimeProvider provider1 = new UtcDateTimeProvider();
IJwtValidator validator1 = new JwtValidator(serializer1, provider1);
IBase64UrlEncoder urlEncoder1 = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer1, validator1,
urlEncoder1);
//解析出PayLoad
var json = decoder.Decode(token, secret, verify: true);

习材料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml
http://www.jianshu.com/p/576dbf44b2ae
https://jwt.io/

相关文章

网站地图xml地图