JWT 的定义与用法

93 阅读3分钟

JWT

JWT 文档

阅读文章

前置知识

解决用户登录的方案是:Cookie + Session

Cookie

什么是 Cookie ?

  • 是属于HTTP协议的东西, 由服务器server向客户端client(可以是浏览器)发的一段token , 这个token就是cookie, 这个token的特殊性在:你必须在你后续的请求中自动带上。

  • 服务器发一个字符串给浏览器,浏览器以后每次向同域名的服务器发送请求的时候,都必须在请求头里面带上这个token,那只要满足这个特征的字符串就叫做cookie

image.png

LocalStorage也可以做到,但它并不是Cookie,也Cookie是自动带上的,LocalStorage在发送请求时,如果不写额外的代码,localStorage的东西是不会发给server的,所以:Cookie是自动的,LocalStorage是手动的。

Session

什么是Session?

  • 保存在服务器的内存或文件里面,用来做对应关系,假如我给用户传的是随机数和它真实的数的对应关系,用户只要把随机数拿来了,就能知道对应的 user 是多少。Session需要保存带内存和文件里面,内存和文件是需要占用服务器的资源的。

eae3a40c9782a6191e0291d374a7033.jpg

d08a146d89b2cb3ee6e334bed45a055.jpg

JWT 的定义

JWT是 JSON Web Token 的缩写。Token 的意思是加密字符串。JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

image.png

  • 如果篡改发送的密文,就会报错不知道对应的原文。优点是服务器根本不用存对应的内容,因为拿到的字符串就是内容本身

JWT 的结构 (JWT = 加密的 uid)

JWT 包括三部分:

header + payload + signature

  • header: 头 (对应的是alg (算法))

  • payload: 体 (对应的是 JSON )

  • signature: 签名(密文) (对应的是 S(密文))

signature = 加密 (私钥,base64(header), base64(body),)

base64 是为了防止内容中出现奇怪的字符,如汉字

最后生成的token

const token = 
  base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)

Session 和 JWT 的区别?

Session 是把 uid 存到内存或者文件里面,然后把 key 发给前端;JWT 是把 uid 存到密文,发送给前端。

JWT 的用法

用户发送一个 JWT 的请求,服务器返回 JWT 的内容,前端把 JWT 存到 LocalStorage 里面;第二步配置 axios库,让 axios库 所有的请求 header 都带上 JWT ,一般带在Authorization;第三步发送请求。

6b7163ea72a4ac77105f0420187e984.jpg

查看是否有 Auth 内 jwt ,有就解析 S 的 uid 和 uid=1 是否一样,解密之后就知道 uid ,去数据库得到对应的user,把 user 变成 JSON 发给前端。

session 的用法

240429365e493430ae097f5f0e7c40d.jpg

为什么JWT不自己放在Cookie里面?

  • CookieHTTP的内容(可能存在一种情况,通信不是HTTP

  • JWT是一个更通用的协议,它不强制你一定使用http,所以JWT是用来做Web认证的(web是远远大于http的)