文章目录
由于HTTP是无状态服务,所以为了满足某些有状态的服务,那么就出现了如下的。
cookie和session是有状态的服务。
cookie
cookie的信息是存储在客户端中,也就是本地的一些文件里面,不过cookie这个性质可能会导致他拥有安全隐患。cookie的一个重要性质是他不可以跨域执行。
session
session也是记录c和b之间的会话机制。session是基于cookie实现的,不过session储存在服务器端,sessionId会被储存在客户端的cookie中。
- 用户请求服务器,服务器根据用户提交信息创建session。
- 返回此session的唯一表示sessionid给客户端
- 收到sessionid后存入cookie中,记录域名
- 查找域名下cookie信息,存在发给服务器,不存在失效。
token
token是一种无状态的令牌。
token的组成:uid+timestamp+sign
!!!!可以跨域
相对于session不需要将信息存入内存或者磁盘,只需要执行解密加密算法知道用户信息即可,所以在一些不需要用户状态的场景中token拥有着安全性高,跨域,无状态等特点。
refresh token和access token
access token存在的时候很短,如果频繁的输入密码账号,用户体验会很差,所以设置refresh token的时候,一旦access token过期了,他就会发送refresh token,如果这个没过期,会分配新的access token。如果过期了还是需要重新登录。
JWt(JSON WEB TOKEN)
JWT的存在简化了跨域问题,如果我想一个公司的2个部门网络,我在其中一个登陆了,另外一个可以用。如果用session实现,需要共享session写入数据库,持久化。这样问题工作量大,持久层可能会挂掉。
JWT是一种无状态的表达。
{
name:liuyi
like:game
expire:2020-8-10 20:10:00
}
加密之后类似于这个。
Header.Payload.Signature
由这3部分组成,由.隔开。
header
header是一个json对象,里面介绍了签名算法和token类型。
{
"alg":"HS256",
"typ":"JWT"
}
alg(algorithm),typ(type)
playload
官方规定7个字段。
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
同时可以自定义字段。
{
"sub":"no"
"name":"liuyi"
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
Signature
对前2部分加密防止数据篡改,需要制定秘钥。使用header里面的签名算法进行加密。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
然后这3个部分用.隔开返回给用户即可。
特点(total copy for mark)
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。