什么是JWT
Json Web Token, 简称 JWT。
JWT 顾名思义,它是 JSON 结构的 token,由三部分组成:
header
payload
signature
header
header 用于描述元信息,例如产生 signature 的算法:
{"typ":"JWT","alg":"HS256"}
其中 alg 关键字就指定了使用哪一种哈希算法来创建 signature
payload
payload 用于携带你希望向服务端传递的信息。你既可以往里添加官方字段(这里的“字段” (field) 也可以被称作“声明” claims),例如 iss (Issuer), sub (Subject), exp (Expiration time),也可以塞入自定义的字段,比如 userId :
{"userId":"b08f86af-35da-48f2-8fab-cef3904660bd"}
signature 译为「签名」
创建签名要分以下几个步骤:
你需要从接口服务端拿到密钥,假设为 secret
将 header 进行 base64 编码,假设结果为 headerStr
将 payload 进行 base64 编码,假设结果为 payloadStr
将 headerStr 和 payloadStr 用 . 字符串拼装起来成为字符 data
以 data 和 secret 作为参数,使用哈希算法计算出签名
如果上述描述还不直观,用伪代码表示就是:
// signature algorithm
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )signature = Hash( data, secret );假设我们的原始JSON结构是这样的:
// Header
{"typ":"JWT","alg":"HS256"}
// Payload:
{"userId":"b08f86af-35da-48f2-8fab-cef3904660bd"}
如果密钥是字符串 secret 的话,那么最终 JWT 的结果就是这样的
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y
由此可见
JWT 的目的不是为了隐藏或者保密数据,而是为了确保数据确实来自被授权的人创建的(不被篡改)