zoukankan      html  css  js  c++  java
  • JWT理论知识

    JWT学习文章:

    第一篇:JWT原理

    第二篇:JWT原理实现代码

    第三篇:在asp.net core中使用JWT


    简介

    JWT全拼是JSON Web Tocken,是目前最流行的跨域身份认证解决方案,特别适合分布式系统,减少用户麻烦,保证账号安全,减少服务器负载。

    有人经常将OAuth与JWT搞混,两种是用于同一场景的不同情况。同一场景是指登录场景,不同情况是指,OAuth是第三方授权登录(详情戳这里),JWT是直接登录。


    产生的背景

    最经典的登录实现方式是通过session:
    1.用户输入用户名、密码提出登录请求;

    2.服务器收到请求并验证用户名和密码,正确情况下存储在服务器的session中,并返回用户session_id;

    3.用户发起新的请求并携带cookie中的session_id;

    4.服务器验证session_id并验证服务器内的session,无误响应用户请求;

    所有后续请求都如此进行,如果服务器对session有时间限制后自动销毁,到时间后用户将重新进行用户名、密码的登录。


    存在的问题

    如果用户数量过大,服务器中存储大量的session信息,严重影响服务器的性能;

    服务器无法方便的进行分布式部署,因为session不能方便的实现服务器间的同步,无法实现横向扩展(不是不能实现,而是实现会变得复杂,例如创建session持久化层,此种方法修改难度大,且持久化层挂掉,所有服务都会挂掉)。

    应运而生,JWT解决了以上的问题。接下来进行学习JWT的相关知识。


    JWT结构

    组成部分

    Header

    Payload

    Signature

    连接形式

    xxxxx.yyyyy.zzzzz

    让我们一步步来说:

    Header

    格式:JSON

    包括内容是:

    Token的类型,就是JWT

    加密的方式,例如HMAC SHA256 or RSA,一般使用HMAC SHA256

    例子:

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

    接着用Base64Url编码成为JWT的第一部分。


    Payload

    存放有效信息的部分,有效信息主要包含三部分:

    • 标准中注册的声明
    • 公共的声明
    • 私有的声明

    标准中注册的声明:

    iss: JWT签发者

    sub: JWT所面向的用户

    aud: 接收JWT的一方

    exp: JWT的过期时间,这个过期时间必须要大于签发时间

    nbf: 定义在什么时间之前,该JWT都是不可用的.

    iat: JWT的签发时间

    jti: JWT的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

    此部分内容建议使用但不强制。

    公共声明:

    可以添加任何信息,一般是用户信息和业务信息。不建议添加敏感信息,因为payload部分会用Base64Url编码,可能会被反向解密。

    私有声明:

    可以存放前后端共同定义的声明,方便前后端进行不敏感的信息交换。同样不建议添加敏感信息,原因也是可能会被解码。

    例子:

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

    此部分内容同样进行Base64Url编码,组成JWT的第二部分内容。


    Signature

    此部分内容是Header和Payload各自经过Base64Url编码后用“.”连接,根据Header中声明的加密方法进行加密后组成的。

    类似下面的方式:

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

    使用方式

    加在http请求或HTTPS的请求头中,样式如下:

    Authorization: Bearer <token>

    注意一定要在token之前加上Bearer,之间空格。

    结语

    掌握JWT的结构和原理是根本。

    大家可以生成一个密钥,在https://JWT.io/#debugger-io上试试,方便进行理解。

    此篇文章可以当做JWT的文档来看,因为结构部分的内容和JWT文档的内容并无二意。

    参考文档:https://JWT.io/introduction

    如果觉得不错,可以推荐收藏一下,让我也更有动力。
  • 相关阅读:
    《超级迷宫》需求规格说明
    超级迷宫冲刺个人计划安排
    审评(HelloWorld团队)
    C语言中的++与*
    a、b交换
    微服务架构浅析及实践心得
    Servlet版本冲突引起的Error
    并发编程:一个100%会发生死锁的程序
    单元测试与Mockito
    Java基础:HashMap假死锁问题的测试、分析和总结
  • 原文地址:https://www.cnblogs.com/jingboweilan/p/14569434.html
Copyright © 2011-2022 走看看