json web token

98 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

前言

以往在用户登录认证中,经常使用 cookie +session 的方式完成用户信息的存储。就是在用户登录成功后服务端就保存 session ,然后返回给客户端一个 sessionId ,客户端再将sessionId 存储在cookie 中。但是这种方式在用户量增多时就会造成服务器开销大,且不是很安全。后来提出一种新的方式 token认证,token 是由JWT 生成的。

JWT

JWT是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方式,用于将各方之间的信息安全地传输为JSON对象。

用处:

  • 认证 : 最常用的使用方式;用户在登录的时候进行认证,通过后将授权信息保存到JWT中,之后每次请求都携带JWT进行访问;
  • 信息交换: JWT中包含信息的签名,因此可以用于安全地信息传递;
    数据结构
  • Header 保存配置信息 (typ:type token类型,alg:algorithm 签名算法)
  • Payload 保存认证信息{}
  • Signature 前两者信息的签名
    整个token生成(三个部分 )
    【header(Base64编码)】  .   【Payload(Base64编码)】 . 【【header(Base64编码)】  .   【Payload(Base64编码)】(header中alg签名算法)】

使用场景

客户端接收服务端返回的 JWT ,然后将其存储在 Cookie 中。之后每次客户端与服务端通信时都带上 JWT。比较合适的用法就是将其放在 HTTP 请求的头信息 Authorization 字段里面。

优劣势

优点:

  • jwt 可用于认证,也可以用于交换信息。
  • 可扩展性好。在分布式场景中如果使用session的话就需要多机器共享 session ,使用时需要将其存储在数据库中或 redis 中进行共享,而使用 JWT 就不需要。
  • JWT 也不存储任何服务端的状态。在 jwt 的payload 中可以存储一些常用信息用于交换信息。

缺点:

  • 安全性:jwt 的payload 是无加密的不能存储敏感数据
  • 一次性:jwt 都是一次性的如果修改了其中的内容就需要重新生成。