什么是jwt?json web token

简介: 什么是jwt?json web token

那这个 Token 是个什么样的呢?

RFC 并没有明确规定;

不过业内比较常见的方案是使用 JWT ;

JWT 是 JSON Web Token 的缩写;

要学习 JWT 我们可以拿 session 作为参照物;

在传统开发中我们在用户登录后会创建一个 session 文件 xxx ;

用户的 id 等信息就存储在 xxx 文件中;

接着会在 Set-Cookie 中返回 xxx 作为 session_id ;

以后前端请求的时候就会在 cookie 中携带 xxx ;

服务器端根据 xxx 从文件中读取用户信息;

从上面的流程我们可以看出要验证一个用户需要有两步;

  1. 传递 session 文件名
  2. 根据文件名从文件中获取用户信息

那我们可不可以不传文件名;

服务器端直接返回用户信息组成的认证字符串;

以后前端就把认证字符串发送给服务器端;

服务器端从认证字符串中获取用户信息;

这样只需要一步就可以验证用户;

不需要 session 文件的参与了;

但是这里面有两个问题需要解决;

  1. 怎么用字符串保存用户信息
  2. 如何防止篡改即服务器端如何信任前端发送的用户信息字符串是真实有效的;

既然本文的标题是 JWT ;

那是时候开始 JWT 的表演了;

下面就有请 JWT 来解决上面的问题;

JWT 定义这个认证字符串为三段;

Header(头部) . Payload(负载) . Signature(签名) ;

Header

头部是一个 JSON ;

{
  "alg": "HS256",
  "typ": "JWT"
}

JSON

Copy

字段 全称 描述
alg algorithm 是签名的算法;一般是 HS256
typ type 固定值为 JWT

Payload

负载同样是一个 JSON ;

{
    "iss": "d8b832c0c8caf0d99e9406ed",
    "sub": "1",
    "aud": "baijunyao",
    "iat": "1557066830",
    "nbf": "1557066840",
    "exp": "1557066850",
    "jti": "9e9668d8b8306ed8caf0d94"
}

JSON

Copy

字段 全称 描述
iss issuer 发布者
sub subject 面向的用户; 一般是用户的 id
aud audience 受众;比如说之前 OAuth 系列中的 client id
iat issued at 签发时间的时间戳
nbf not before 生效时间的时间戳
exp expiration time 过期时间的时间戳
jti jwt id 每个 JWT 自己的唯一 id

上面这些是 JWT 协议定义的信息;

负载中还可以存放自定义的信息;

Signature

签名的作用是保证头部和负载的信息不能被篡改;

默认使用 HS256 算法进行签名;

如果对 HS256 不了解的话可以先简单的把它约等于 MD5 加盐;

HS256 需要一个 Secret ;

这个 Secret 是保存在服务器端的不可以泄露;

否则别人就可以伪造 JWT 了;

签名的方式是把 头部和负载分别 base64UrlEncode 后用 . 拼接起来使用 Secret 进行 HS256 ;

Signature = HS256(base64UrlEncode(Header) . base64UrlEncode(Payload), Secret)

PHP

Copy

我从 jwt.io 上粘贴个例子;

image.png

至此头部、负载、签名我们已经凑齐了;

我们把 base64UrlEncode 的头部和负载以及签名用 . 拼接起来就是一个 JWT 了;

JWT = base64UrlEncode(Header) . base64UrlEncode(Payload) . HS256(base64UrlEncode(Header) . base64UrlEncode(Payload), Secret)

PHP

Copy

认真观察上面这个生成 JWT 的过程;

此处一个送命题;

敲黑板画重点了;

Secret 只是用于签名;

并没有用于加密;

JWT 中的 Header 和 Payload 是使用 base64UrlEncode 进行加密的;

任何人都可以非常轻松的就使用 base64UrlDecode 进行解密;

所以虽然 Payload 中可以存储自定义的信息;

但千万不能存储敏感信息;

JWT 是由服务器端生成返回给前端的;

前端在发送请求的时候一般把 JWT 放在 HTTP Headers 中的 Authorization 字段中;

Accept: */*
Host: baijunyao.com
Authorization: Bearer JWT_xxxx
...

Bash

Copy

终于讲的差不多了;

接着来总结下 JWT 的优缺点吧;

优点

  1. 相比于 session 少了读取文件的步骤,效率更高,方便扩展
  2. 因为不使用 cookie 天生免疫 CSRF 攻击
  3. 因为不使用 cookie 不用担心用户禁用 cookie ;不用悬挂本站需要使用 cookie 的提示信息;
  4. 适合 APP 前后端分离的场景

缺点

  1. 一旦签发不能撤销 没有类似清空 session 的操作
  2. 不能自动续签

针对上面缺点的解决方案;

  1. 使用黑名单机制; 把作废的 JWT 放入黑名单; 但是这样就引入了状态; 相比 session 就没有那么大的优势了;
  2. 使用 OAuth 中的 refresh_token
目录
相关文章
|
22天前
|
JSON JavaScript 数据格式
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
37 1
|
1月前
|
JSON 算法 安全
什么是JWT(Json-Web-Token)?JWT的用途和优势是什么?讲解+实战,一篇文章学会JWT怎么用!
什么是JWT(Json-Web-Token)?JWT的用途和优势是什么?讲解+实战,一篇文章学会JWT怎么用!
34 0
什么是JWT(Json-Web-Token)?JWT的用途和优势是什么?讲解+实战,一篇文章学会JWT怎么用!
|
16天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
1月前
|
JSON 大数据 数据格式
web后端-json递归获取key值
web后端-json递归获取key值
|
2月前
|
存储 JSON 安全
解密Web安全:Session、Cookie和Token的不解之谜
解密Web安全:Session、Cookie和Token的不解之谜
68 0
|
3月前
|
存储 JSON 算法
为什么JSON Web Token对于应用程序中的会话管理很有用
为什么JSON Web Token对于应用程序中的会话管理很有用
|
11天前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
|
30天前
|
前端开发 Java Spring
SpringBoot通过拦截器和JWT令牌实现登录验证
该文介绍了JWT工具类、匿名访问注解、JWT验证拦截器的实现以及拦截器注册。使用`java-jwt`库生成和验证JWT,JwtUtil类包含generateToken和verifyToken方法。自定义注解`@AllowAnon`允许接口匿名访问。JwtInterceptor在Spring MVC中拦截请求,检查JWT令牌有效性。InterceptorConfig配置拦截器,注册并设定拦截与排除规则。UserController示例展示了注册、登录(允许匿名)和需要验证的用户详情接口。
130 1
|
1月前
|
存储 JSON Java
spring boot3登录开发-1(整合jwt)
spring boot3登录开发-1(整合jwt)
56 1
|
2月前
|
开发框架 安全 Java
【Java专题_01】springboot+Shiro+Jwt整合方案
【Java专题_01】springboot+Shiro+Jwt整合方案