分布式 权限控制(JWT)
一、认证机制
1. Cookie-Sesion
A. cookie-session认证机制是为一次请求认证在服务端创建一个session对象,同时在客户端的浏览器创建一个cookie对象,通过客户端带上来的cookie对象与服务端的session对象匹配来实现状态管理的;
B. 缺点:每个用户经过我们的应用认证之后,都会在服务端做一次记录,以方便用户下次请求的鉴别,一般session都是保存在内存中,而随着认证用户的增多,服务端开销会明显增大;
如果认证信息(session)是被保存在内存中,这意味着用户下次请求还必须要发到这台服务器上,这样才能拿到授权的资源,对于分布式应用,则限制了负载均衡器的能力,不易扩展;
通过cookie来进行用户识别,如果cookie被捕获,服务器就会很容易受到跨站请求伪造的攻击(CSRF)。
2. JWT Token
A. JWT是为了在网络应用环境间传递声明而执行的一种基于JSON标准,JWT的声明一般被用在身份提供者和服务提供者间传递被认证的用户身份信息,以便与从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,服务器不会保存任何会话状态,即服务器无状态;
B. 特点:体积小,因而传输速度快;
传输方式多样,如URL/POST参数/HTTP头部等方式传输;
严格的结构化,在payload中包含了所有与用户相关的验证消息,如用户可访问路由、访问有效期等信息,服务器无需再去连接数据库验证信息的有效性,并且payload支持为应用定制化。
二、JWT(JSON Web Token)
1. JWT组成结构
A. Header(头部):JSON对象,用来描述JWT的元数据,最后用Base64URL算法将其转化为字符串;
{
"alg": "HS256", // algorithm,签名的算法,默认是HMAC SHA256
"typ": "JWT" // type,令牌的类型,JWT令牌统一写成JWT
}
B. Payload(载荷内容):也是JSON对象,用来存放主体内容的地方,包含要传递的数据,由标准中注册的声明、公共的声明和私有的声明三部分构成,最后也用Base64URL算法将其转化为字符串;
标准中注册的声明:
{
"iss": // issuer,签发者
"sub": // subject,主题
"aud": // audience,接收JWT的一方
"exp": // expiration time,JWT的过期时间
"nbf": // Not Before,生效时间,在此之前不可用
"iat": // Issued At,签发时间
"jti": // JWT ID,JWT唯一身份标识,主要用作一次性token,避免重放攻击
}
公共的声明:一般添加用户的相关信息或其他业务需要的必要信息,不要添加敏感信息,因为base64是对称加密,可解密的;
私有的声明:是提供者与消费者所共同自定义的声明,也不要添加敏感信息;
C .Signature(签名):是由Base64URL后的header和payload,再加上秘钥secret进行算法(默认HMAC SHA256)加密构成的,秘钥仅仅保存在服务器中;
由于签名是对头部和载荷内容进行签名,如果有人对头部以及载荷的内容解码之后进行修改,再编码的话,加上未知的私钥,那么新的签名和之前的就不一样,这样能保证token不被篡改,这是JWT安全机制;
另外Base64URL是Base64算法基础上将三个字符变换下,"="去掉,"+"用"-"替换,"/"用"_"替换;
综合:Token就是将头部、载荷内容和签名的这三部分用点符号连接形成的JWT,如:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzgwMjc4ODksInVzZXJuYW1lIjoiYWRtaW4ifQ.uE-Nhr1C_gXVxYUdWik9T6_rIY9KLDYePddXbfvXNFs
2. JWT用法
A. 前端:Authorization: Bearer token 客户端接收服务器返回的token,可存储在localStorage中,每次客户端与服务器交互都需要携带;
B. 后端:用户请求登录服务器 ->服务器接收到请求生成jwt token并返回 ->用户请求携带token认证 ->认证通过接着后面的请求,认证不通过,前端重置登录页面。
3. JWT优缺点
A. 优点:是无状态会话解决方案之一,支持跨域验证,特别适用于分布式站点单点登录,还可用于信息交换,用来减少与数据库交互的次数;
B. 缺点:由于服务器不保存会话状态,所以使用期间不可能取消令牌或更改令牌权限,也就是一旦JWT签发,在有效期内将会一直有效;
C. 针对令牌签发无法作废的问题可以借助其他办法解决,如使用redis存储信息,作废时删除信息,校验token时结合二者一起判断。