对于使用负载均衡的服务器来讲,使用 JWT(JSON WEB TOKEN) 是一个更优的选择,session受到单台服务器的限制,一个用户登陆事后就只能分配到
这一台服务器上,这和负载均衡的初衷不一致啊,而 jwt 就解决了这类的痛点git
header
和signature
能够保证payload
没有被篡改,保证信息的安全JWT 是由header,payload,signature
三部分组成的,我们先用例子说话github
{ "alg": "HS256", "typ": "JWT" } // base64编码的字符串`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9`
这里规定了加密算法,hash256算法
{ "sub": "1234567890", "name": "John Doe", "admin": true } // base64编码的字符串`eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9`
这里的内容没有强制要求,由于 paylaod 就是为了承载内容而存在的,不过想用规范的话也能够参考下面的 * iss: jwt签发者 * sub: jwt所面向的用户 * aud: 接收jwt的一方 * exp: jwt的过时时间,这个过时时间必需要大于签发时间 * nbf: 定义在什么时间以前,该jwt都是不可用的. * iat: jwt的签发时间 * jti: jwt的惟一身份标识,主要用来做为一次性token,从而回避重放攻击。
是用 header + payload + secret
组合起来加密的,公式是:json
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
这里 secret
就是本身定义的一个随机字符串,这一个过程只能发生在 server 端,会随机生成一个 hash 值安全
这样组合起来以后就是一个完整的 jwt 了:服务器
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.4c9540f793ab33b13670169bdf444c1eb1c37047f18e861981e14e34587b1e04
这里有一个用 go 加密和验证 jwt 的 demosession
选择 jwt 最大的理由:负载均衡
不过 jwt 不保证的安全问题:编码
header,paylaod
是 base64编码,至关于明文可见的,所以不能在payload
中放入敏感信息为了安全仍是要上 https加密
相关推荐:
jwt.io