JWT认证机制 : 用户登录之后, 为了保持用户的登录状态, 使用Json Web Token认证机制
1. session认证方式:
基于session的认证方式会出现的问题(为什么不用session认证):
Session: 每认证一个用户之后, 服务端做一次记录, session都是保存在内存中,随着认证用户的增多,服务端的开销会明显增大。
CSRF: session是依赖于cookie的, 如果cookie被截获,用户就会很容易受到跨站请求伪造的攻击。
拓展性: 认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。
2. JWT token认证机制:
jwt认证流程:
- 用户使用用户名和密码来请求服务器进行登录
- 服务器验证用户的登录信息
- 服务器通过验证,生成一个token并返回给用户
- 客户端存储token,并在每次验证请求携带上这个token值
- 服务端验证token值,并返回数据
3. JWT token数据格式
JWT token是一个字符串,由3部分组成,用.
隔开。如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
组成介绍:
1) 头部(header) : 声明类型,这里是jwt 声明加密的算法 通常直接使用 HMAC SHA256
{ 'typ': 'JWT', 'alg': 'HS256' }
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2)载荷(payload) : 载荷就是存放有效数据的地方。这些有效数据主要保存存储的数据和token的有效时间。
{ "username": "smart", "mobile": "13155667788", "email": "smart@163.com", "exp": "<token有效时间>" }
然后将其进行base64加密,得到JWT的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
3) 签名(signature) : JWT的第三部分是一个签名信息,用来防止JWT token被伪造。
4. JWT认证使用注意点:
- payload中不要存过于敏感的数据
- 服务器的签名加密密钥需要保存好
- 使用https安全网络协议