HTTP 协议是一种无状态的传输协议,每一个请求都是完全独立的,所以一般web开发都会采用cookie-session机制让服务器有办法能够区分出发送请求的用户是谁,在服务器中会维护了一些用户的session信息,为了服务器的高可用,会把用户的状态信息存储到Redis等集中式的存储中。 除了cookie-session机制,还可以使用JWT(JSON Web Token)的方案,能够让信息不存储在服务端,且也能防止信息在传输过程中被篡改。
JWT的原理:服务器认证以后,生成JSON 对象,发回给用户。以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。 JWT:的数据结构由三部分组成Header(头部)、Payload(负载)、Signature(签名)。写成一行,就是下面的样子:
Header.Payload.Signature
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据,可以定义业务需要的私有字段,JWT 规定了7个官方字段,供选用。
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
Signature 部分是对前两部分的签名,防止数据篡改。需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,其中header和payload部分需要使用Base64URL进行转化。然后三个部分之间用”点”(.)分隔,就可以返回给用户。
最后的效果如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwMTIxMiIsIm5hbWUiOiJKb2huIERvZSIsImlhdCI6MTUxNjIzOTAyMn0.RoeGlqmkqtGrgjmV0Z5EF8bwCLQdzRXwPiG1ZmiNVfU
客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
JWT的应用目前感觉还是比较少,但是提供了一种服务端无状态的思路,正常情况下使用cookie-session机制能够满足要求了。
Original: https://www.cnblogs.com/csophys/p/15887898.html
Author: csophys
Title: 架构安全性设计、部分示例及原理分析
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580000/
转载文章受原作者版权保护。转载请注明原作者出处!