JWT(跨域身份验证)

1. JWT概念

  • 常用的用户身份认证方法
    • 用户向服务器发送用户名和密码
    • 验证通过后,相关信息(用户角色,登录时间)保存到当前会话
    • 服务器向用户返回session_id,session信息写入用户Cookie
    • 用户的每个后续请求都会通过Cookie中取出的session_id传给服务器
    • 服务器收到session_id并对比之前保存数据,确认用户身份
  • 存在的缺陷和问题
    • 没有分布式架构,无法支持横向扩展
    • 如果使用一个服务器,该模式完全没有问题。但是,如果它是服务器群集或面向服务的跨域体系结构的话,则需要一个统一的session数据库库来保存会话数据实现共享,这样负载均衡下的每个服务器才可以正确的验证用户身份
  • JWT
    • Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准
    • 该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
    • 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。
    • 在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token, 并且必须在本地保存 (通常在本地存储中)。
    • 每当用户要访问受保护的路由或资源 (端点) 时, 用户代理(user agent)必须连同请求一起发送 JWT, 通常在授权标头中使用Bearer schema。后端服务器接收到带有 JWT 的请求时, 首先要做的是验证token。

2. 格式

  • JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C
  • A由JWT头部信息header经过base64加密得到
    • #默认的头信息
      {
             
        "alg": "HS256",
        "typ": "JWT"
      }
      
      #官网测试:https://jwt.io/
      #base64加密后的字符串为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
      
  • B是payload,存放有效信息的地方,这些信息包含三个部分:
    • 标准中注册的声明 (建议但不强制使用)
      • iss: jwt签发者
      • sub: jwt所面向的用户
      • aud: 接收jwt的一方
      • exp: jwt的过期时间,这个过期时间必须要大于签发时间
      • nbf: 定义在什么时间之前,该jwt都是不可用的.
      • iat: jwt的签发时间
      • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
    • 公共的声明
      • 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
    • 私有的声明
      • 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
    • #存放的数据:
      {
             
        "sub": "1234567890",
        "name": "John Doe",
        "iat": 1516239022
      }
      
      #base64后的字符串为:
      eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
      
  • C由A和B通过加密算法得到,用作对token进行校验,看是否有效
    • 这个部分需要bas

你可能感兴趣的:(工具,jwt)