500字学JWT
2019-07-18
JWT
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。通过客户端携带一个特定的字符串来实现认证。
客户端实际的JWT存储为一个加密字符串(BASE64编码),一般表现为Header.Payload.Signature
的形式。通过.
分割的JWT的三个部分为:
-
Header(头部)
包含本条JWT的元数据,例如加密算法
alg
、类型typ
等。通过BASE64转为字符串。 -
Payload(负载)
包含签发人
iss
、过期时间exp
等等,一般为真正的登陆凭证。通过BASE64转为字符串。 -
Signature(签名)
防止JWT伪造的篡改的内容,公式为:
Signature = HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
其中secret
为服务器秘钥。服务器在秘钥不泄漏的情况下,可以验证客户端发来的JWT字段是否被篡改。
为什么要采用JWT
JWT的目标在于将会话信息存储于客户端,实现服务端“零状态”,只需要客户端每次请求时带上JWT,服务端校验JWT完整性,如果通过,直接从JWT中取出会话信息(比如访问权限)即可。不让服务端存状态(也就是传统意义上的会话session)的意义是:
- 如果服务端存session,那么如果是服务端集群,就要求所有的集群每台服务器都要有存取session的能力,造成拓展困难。
- 跨域问题,如果普通session要实现“A网站登陆,B网站浏览”这种形式,需要A网站和B网站的服务器之间共享session,比较麻烦。
客户端怎么使用
并没有严格规定客户端必须如何使用JWT,甚至可以放在Cookie字段中。但为了跨域,一般放在HTTP头的Authorization
字段中
Authorization: Bearer <token>