1.用户名密码登陆
2.验证通过,server会存储登陆状态,并返回session ID给cliet
3.后续请求带着session ID,服务器根据已存储的session进行校验
4.返回请求结果。
服务端要存储登陆状态,这对单机模式没什么用影响,对于集群模式是很大的挑战,为了方便横向扩展,要把这些登陆态拆出来,常见的做法是写入redis集群和持久化session数据,有了redis程序员就可以大展身手了,可以把很多信息放入redis不在局限于session ID,经常把用户信息也放入进去,这就会照成很多未知风险,虽然技术规范可以规避一些风险,但是单点风险还是存在的。
就跟0和1一样,登陆状态可以有客户端保存,服务端做校验,只要保证是自己签发的且在有效期内就可以了。JWT就是这样思路产生的一种验证机制。
JSON Web令牌(JWT)是一个紧凑的采用URL安全表示方法的声明,用于在两方之间传输。JWT的声明被编码为一个JSON对象,作为一个JSON Web Signature(JWS)结构的有效载荷或作为一个JSON Web Encryption(JWE)结构的明码文本,允许声明被数字签名和进行完整性检查,通过消息认证码(MAC)或者加解密。
xxxxx.yyyyy.zzzzz
jwt格式采用紧凑型,使用“.”作为分隔符,有header,payload,signature三部分组成
Header
header所表示的JSON对象通常由2个部分组成:token的类型,即”JWT”; token所采用的hash算法,例如HMAC SHA256或者RSA。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
{
"alg": "HS256",
"typ": "JWT"
}
Payload
注册声明的字段有7个
公开声明,私有声明可以自己定义
使用Base64 URL算法将上述JSON对象转换为字符串保存。
Signature
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证消息在此过程中未被更改,并且,在使用私钥签名的令牌的情况下,它还可以验证JWT的发件人是否是它所声称的人
默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。
下图显示了如何获取JWT并用于访问API或资源
step1:向授权服务器发送请求
step2:得到授权token
step3:使用获取到的token去访问资源
客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。
access-control-allow-origin →*
cache-control →no-cache, no-store, max-age=0, must-revalidate
content-length →0
date →Mon, 17 Dec 2018 14:15:14 GMT
expires →0
pragma →no-cache
token →Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0MyIsImV4cCI6MTU0NTA1OTcxNCwiaWF0IjoxNTQ1MDU2MTE0LCJyb2wiOiJST0xFX0FETUlOIn0.LXVr9n_haQwguZgL6zjGKTYg4p8vWI3zBCjsgVdzOiwHUH5BtkbhVf3hN5ZLqTMn7AK9tUOdtbqENfPRpMSzww
vary →Origin, Access-Control-Request-Method, Access-Control-Request-Headers
x-content-type-options →nosniff
x-frame-options →DENY
x-xss-protection →1; mode=block
此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。当跨域时,也可以将JWT被放置于POST请求的数据主体中。
Authorization: Bearer
参考资料:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。