zoukankan      html  css  js  c++  java
  • JWT简明介绍

    JSON Web Token一种数据格式,用来表示Token。具有可扩展、防篡改、能够在URL中安全传输的特性,已经形成标准,定义在rfc7519

    JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.

    JWT的发音跟单词jot相同,读[dʒɑt]。

    JWT长什么样

    JWT的最终表现形式是一个字符串,由两个点分隔的,不包含换行字符串。就像下面这样:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.6xWqaqNdCsyhIjc32MJKfikpOhAaBG9mz93He-E3Hvs
    

    两个“.”把JWT分成了三段:

    HEADER.PAYLOAD.SIGNATURE
    

    HEADER、PAYLOAD、SIGNATURE这三段内容都是URL Safe的Base64编码字符串。Base64大家都清楚,URL Safe是把Base64编码后的字符串里面的=省略、+和/替换成-和_。这样最终的字符串就能够安全地放到URL里面而不需要再encode了。

    Header这段URL Safe的Base64编码字符串“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9”在decode之后,是一个二进制的JSON。

    转化成JSON字符串,是这样的:

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

    格式就是这样了,typ不会变,alg代表签名算法。HS256代表HMAC-SHA256,是当前最常用的MAC算法。不了解MAC可以看这里

    alg还可以有其它取值,除了用MAC,还可以用RSA、ECC这种非对称签名算法。这个算法是用来计算SIGNATURE这一段内容的,具体干啥用,下面再具体介绍。

    PAYLOAD

    Payload这段URL Safe的Base64编码字符串“eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ”在decode之后,也是二进制的JSON。

    转化成JSON字符串,是这样的:

    {
      "iss": "joe",
      "exp": 1300819380,
      "http://example.com/is_root": true
    }
    

    顾名思义,这一段是JWT对应用来说真正有用的内容。rfc7519定义了一些可以使用的固定字段:

    • "iss" (Issuer) 签发者
    • "aud" (Audience) 申请签发者
    • "exp" (Expiration Time) 过期时间
    • "nbf" (Not Before) 生效时间
    • "iat" (Issued At) 签发时间
    • "jti" (JWT ID) 唯一编号

    虽然定义了一些字段,但这些字段全都是可选的,另外可以随意添加自定义字段。所以Payload可以理解成一个可以自定义的JSON。

    SIGNATURE

    JSON编码、Base64编码都是对数据进行的序列化,相当于明文存储。需要一种机制来保证JWT在传输过程中没有被篡改。

    SIGNATURE就是干这事儿用的,“6xWqaqNdCsyhIjc32MJKfikpOhAaBG9mz93He-E3Hvs”这一段decode完,就是一个HMAC-SHA256的签名。相当于下面这段代码的计算结果:

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      your-256-bit-secret
    )
    

    其实就是用密钥对JWT前两段做了个签名,然后拼接在后面。

    只要密钥不丢,别人即便拿到了JWT,解码看到了里面都有啥,也不能篡改内容。

    解析示例

    JWT

    JWT有什么用

    Web应用在很多时候需要令牌(Token)来串联业务,比如登录态保持、SSO登录态传递等。

    在大部分场景,如果Token中能够包含一部分业务数据,业务流程会大大简化。JWT就是这样一种数据格式约定,考虑到了这些场景下对Token格式的要求,比如防篡改、TTL、多种算法、URL Safe等等,让大家可以拿来就用,不必再重复设计格式。

    很方便,不过也仅仅就是一种格式而已,如果觉着不好,比如嫌JWT最终生成的字符串太长,那就设计自己的格式好了。

    Reference

    https://tools.ietf.org/html/rfc7519
    https://jwt.io/introduction/

  • 相关阅读:
    未来简史之数据主义(Dataism)
    10分钟看懂《人类简史》和《未来简史》
    SignalR来做实时Web聊天
    .Net Core应用搭建的分布式邮件系统设计
    AspNetCore-MVC实战系列(四)之结尾
    AspNetCore-MVC实战系列(三)之个人中心
    AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
    AspNetCore
    爱留图
    .NetCore上传多文件的几种示例
  • 原文地址:https://www.cnblogs.com/xinzhao/p/11558848.html
Copyright © 2011-2022 走看看