JWT.JPG

JWT

  1. header 包含如何计算 JWT 签名的信息
{
    "typ": "JWT",
    "alg": "HS256"
}
  1. payload 负载存储信息
{
    "userId": "b08f86af-35da-48f2-8fab-cef3904660bd"
}
  1. 生成 signature 签名参考伪代码
// signature algorithm
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
hashedData = hash( data, secret )
signature = base64urlEncode( hashedData )

// header
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
// payload
eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ

将编译后的 header payload 进行拼接,使用指定的签名算法和密钥对它计算。在我们例子中,也就是使用 HS256 算法,密钥为字符串 secret,对字符串 data 计算得到字符串 hashedData。然后,通过 base64url 对字符串 hashedData 编码得到下面的 JWT 签名(signature)

// signature
-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
  1. 将以上三个模块合并 header.payload.signature 使用 JWT 的目的不是以任何方式隐藏或者模糊数据,使用 JWT 的目的是为了证明发送的数据是由可信的源(用户)创建的
  2. 校验,我们使用的 JWT 是由 HS256 算法签名 —— 这个算法的密钥只有认证服务器和应用服务器知道。当应用服务器设置他的认证过程时,应用服务器从认证服务器那接收密钥。由于应用知道密钥,当用户向应用发起携带 JWT 的 API 请求时,应用可以执行和 Step 3 一样的签名算法。然后应用可以校验它自己 hash 操作生成的签名是否和 JWT 中的签名匹配(即它匹配认证服务器创建的 JWT 签名)。如果签名匹配,意味着 JWT 是合法的

基于 cookie 的跨域认证

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。