PHP开发PHP经验分享

JWT 认证方案学习

2021-02-01  本文已影响0人  phpworkerman
定义

JWT (JSON WEB TOKEN) 是一种安全通讯标准,它定义了一种紧凑自包含的方式,用于在各方之间安全的传输 JSON 对象。常见应用场景是API之间的认证通讯。

一般的用户认证流程

1、请求方发送账户密码到服务器,验证账户可用性。
2、验证成功,生成 session,保存在服务端。
3、服务端返回一个 session ID, 保存在客户端 cookie 中。
4、客户端请求时携带 cookie。
5、服务器解析 cookie 中携带的 session ID,验证通过后返回响应数据。

以上流程核心是基于 session 进行状态管理,这样的认证方案有以下问题:

1、客户端如果禁用 cookie,将无法维持请求的身份验证状态。
2、分布式部署的环境中,需要考虑多机 session 的一致性。
3、请求会产生跨域问题。

JWT 原理

服务器和客户端之间的通讯信息完全采用 json 传递,不需要使用 session 进行状态维持。

{
  "alg": "HS256",  #加密方式
  "typ": "JWT"   #令牌类型
}

2、载荷(Payload),信息传输的主要内容,包含

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3、签名(Signature),根据头部和载荷,加盐后根据头部指定算法生成

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

头部和载荷根据算法 Base64URL 进行转换,结合签名按顺序以”.“拼接形成 JWT 。

jwt.png
JWT 的用法

当客户端根据凭证成功登陆时,服务器将返回 JWT,客户端每次访问都应该携带 JWT,可以将放入cookie,但存在跨域问题,好的解决方式是加入 HTTP 请求头 Authorization 中

Authorization: Bearer <token>
JWT 的特点

1、JWT 脱离了 session 的束缚,服务端不需要再维持 session 状态,但也无法控制 token 的状态了,JWT 一旦签发,在到期之前始终有效,除非服务器有额外的验证逻辑。
2、JWT 可以很方便的支持跨域。
3、JWT 本身包含了验证信息,如果发生泄漏,任何人都可以使用令牌的权限进行请求。
4、JWT 本身不加密,需要通过更安全的 HTTPS 协议传输。

上一篇下一篇

猜你喜欢

热点阅读