• JWT知识整理


    JSON Web Token:(https://jwt.io/

    JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息。 这些信息可以通过数字签名进行验证和信任。 可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

    JWT适用场景:

    Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

    Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

    JWT 结构:

    JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:Header,Payload,Signature(签名)Sample:zzzzzzzzz.xxxxxxxxxx.ccccccccc

    Header(头信息):

    由两部分组成,令牌类型(即:JWT)、算法名称(HMAC SHA256或者RSA等,默认为HMAC SHA256(写成 HS256)),例如:

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

    然后,用Base64对这个JSON编码就得到JWT的第一部分。

    Payload(有效载荷):

    JWT的第二部分是payload,其中包含claims。claims是关于实体(常用的是用户信息)和其他数据的声明,claims有三种类型: registered, public, private。示例:

    {
      "sub": "***",
      "name": "***",
      "admin": true
    }

    Registered claims : 这些是一组预定义的claims,非强制性的,但是推荐使用, iss(发行人), exp(到期时间), sub(主题), aud(受众)等;

    JWT 规定了7个官方字段:

    iss (issuer):签发人

    exp (expiration time):过期时间

    sub (subject):主题

    aud (audience):受众

    nbf (Not Before):生效时间

    iat (Issued At):签发时间

    jti (JWT ID):编号

    Public claims : 自定义claims,注意不要和JWT注册表中属性冲突。

    Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。

    然后,再经过Base64Url编码,形成JWT的第二部分;

    注意:对于签名令牌,此信息虽然可以防止篡改,但任何人都可以读取。除非加密,否则不要将敏感信息放入到Payload或Header元素中。

    Signature(签名):

    要创建签名部分,必须采用编码的Header,编码的Payload,secret(秘钥),Header中指定的算法,并对其进行签名,形成JWT的第三部分。
    例如,如果要使用HMAC SHA256算法,将按以下方式创建签名:

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

    签名用于验证消息在此过程中未被篡改,并且,在使用私钥签名令牌的情况下,它还可以验证JWT的请求方是否是它所声明的请求方。

    算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户,例如:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

    JWT工作机制

    在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web Token(即:JWT)。由于令牌是凭证,因此必须非常小心以防止出现安全问题。一般情况下,不应将令牌保留的时间超过要求。理论上超时时间越短越好。

    每当用户想要访问受保护的路由或资源时,用户代理应该使用Bearer模式发送JWT,通常在Authorization header中。

    Authorization: Bearer <token>

    服务器的受保护路由将检查Authorization header中的有效JWT ,如果有效,则允许用户访问受保护资源。如果JWT包含必要的数据,则可以减少查询数据库或缓存信息。
    如果在Authorization header中发送令牌,则跨域资源共享(CORS)将不会成为问题,因为它不使用cookie。

    注意:使用签名令牌,虽然他们无法更改,但是令牌中包含的所有信息都会向用户或其他方公开。这意味着不应该在令牌中放置敏感信息。

    应用(或者客户端)想授权服务器请求授权。例如,如果用授权码流程的话,就是/oauth/authorize   ==>  当授权被许可以后,授权服务器返回一个access token给应用  ==>  应用使用access token访问受保护的资源(比如:API)

    使用JWT的好处:

    相比Simple Web Tokens (SWT)(简单Web令牌) and Security Assertion Markup Language Tokens (SAML)(安全断言标记语言令牌);

    JWT比SAML更简洁,在HTML和HTTP环境中传递更方便;
    在安全方面,SWT只能使用HMAC算法通过共享密钥对称签名。但是,JWT和SAML令牌可以使用X.509证书形式的公钥/私钥对进行签名。与签名JSON的简单性相比,使用XML数字签名可能会存在安全漏洞;
    JSON解析成对象相比XML更流行、方便。

    基于Token的身份认证 与 基于服务器的身份认证:

    基于服务器的身份认证:

    传统的做法是将已经认证过的用户信息存储在服务器上,比如Session。用户下次请求的时候带着Session ID,然后服务器以此检查用户是否认证过。

    这种基于服务器的身份认证方式存在一些问题:

    Sessions : 每次用户认证通过以后,服务器需要创建一条记录保存用户信息,通常是在内存中,随着认证通过的用户越来越多,服务器的在这里的开销就会越来越大。

    Scalability : 由于Session是在内存中的,这就带来一些扩展性的问题。

    CORS : 当我们想要扩展我们的应用,让我们的数据被多个移动设备使用时,我们必须考虑跨资源共享问题。当使用AJAX调用从另一个域名下获取资源时,我们可能会遇到禁止请求的问题。

    CSRF : 用户很容易受到CSRF攻击。

    JWT与Session的差异:

    相同点是,它们都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的。

    Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。

    而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。

    Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

    Token的身份认证是如何工作的:

    1. 用户携带用户名和密码请求访问
    2. 服务器校验用户凭据
    3. 应用提供一个token给客户端
    4. 客户端存储token,并且在随后的每一次请求中都带着它
    5. 服务器校验token并返回数据

    注意:

    1. 每一次请求都需要token
    2. Token应该放在请求header中
    3. 我们还需要将服务器设置为接受来自所有域的请求,用Access-Control-Allow-Origin: *

    JWT与OAuth的区别

    1. OAuth2是一种授权框架 ,JWT是一种认证协议
    2. 无论使用哪种方式切记用HTTPS来保证数据的安全性
    3. OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app),而JWT是用在前后端分离, 需要简单的对后台API进行保护时使用。
  • 相关阅读:
    CentOS下安装vsftpd
    Linux下快速删除大量文件
    /var/spool/postfix/maildrop/ 中有大量的文件
    Linux 查看目录大小及文件数量命令
    windows下体验Redis
    hMailServer SSL 配置
    vmware 安装 Mac OS X 10.9 Mavericks
    提问和看不懂
    C 语言学习 第三次作业总结
    C 语言学习 第二次作业总结
  • 原文地址:https://www.cnblogs.com/MrZheng/p/11594464.html
Copyright © 2020-2023  润新知