Go Gin使用JWT实现认证机制

什么是JWT

JWT是JSON Web Token的缩写,是一种跨域认证的解决方案。 

使用JWT解决什么问题 

传统的登录认证的实现,依赖客户端浏览器的cookie和服务器的session,这种实现登录的方式有很大的局限性。

对于部署在单台服务器的应用来说,使用cookie+session登录认证的方案尚且可以接受。

但如果应用程序需要部署到多台服务器上呢?这里面就涉及到session的共享问题,另外,如果不同的域名想实现单点登录功能呢?显示cookie+session同样无法做到。

而要解决上面提出的问题,可以使用JWT,让应用变成无状态,避免session共享问题,而且可以很容易实现服务器的扩展。

JWT的格式 

一个正确的JWT格式如下所示:JWT字符串由Header,Payload,Signature三个部分组成,中间使用逗号连接

eyJhbGciOiJIUzI1N.eyJleHAizIjoidGVzdC5jb20ifQ.u7tP_cwmX0JS4LOfh5ZoV6t
Header

Header是一个JSON对象,由token类型和加密算法两个部分组成的

{
  "typ": "JWT",//默认为JWT
  "alg": "HS256"//支持多种加密算法
}

 将上面的JSON对象使用Base64URL算法转换成字符串,即可得到JWT中的Header部分

Base64 编码是一种将二进制数据编码为 ASCII 字符串的方法。然而,Base64 编码后的字符串中可能包含 +/= 这三个字符,这些字符在 URL 中有特殊含义:

  • + 字符在 URL 中用作分隔符。
  • / 字符在 URL 中用于分隔路径。
  • = 字符在 URL 中用作查询参数的赋值符号。

为了避免这些字符在 URL 中引起问题,JWT 使用了 Base64 URL 安全编码,它是 Base64 编码的一个变种,做了以下修改:

  • 将 + 替换为 -,这在 Base64 URL 编码中是常见的替换字符。
  • 将 / 替换为 _,这同样是为了 URL 安全。
  • 移除 =,这是 Base64 编码中的填充字符,用于确保编码后的字符串长度是 4 的倍数。在 Base64 URL 编码中,这个填充字符被省略,以避免在 URL 中使用。
Payload

JWT的Payload部分与Header一样,也是一个JSON对象,用来存放我们实际需要的数据,JWT标准提供了七个可选的字段,分别为:

除了标准的字段外,我们可以任意定义私有的字段以满足业务需求,如:

{
    iss:"my",//标准字段
    jti:"test",//标准字段
    username:"aaa",//自定义字段
    "gender":"男",
    "avatar":"https://1.jpg"
}

将上面的JSON对象使用Base64URL算法转换成字符串,即可得到JWT中的Payload部分。

Signature

Signature是JWT的签名,生成方式为:将Header与Payload进行Base64URL算法编码后,用逗号链接,再使用密钥(secretKey)和Header中指的加密方式进行加密,最终生成Signature。

JWT的特点

  1. 最好使用HTTPS协议,防止JWT被盗的可能。

  2. 除了JWT签发时间到期外,没有其他办法让已经生成的JWT失效,除非服务器端换算法。

  3. 在JWT不加密的情况下,JWT不应该存储敏感的信息,如果要存放敏感信息,最好再次加密。

  4. JWT最好设置较短的过期时间,防止被盗用后一直有效,降低损失。

  5. JWT的Payload也可以存储一些业务信息,这样可以减少数据库的查询。

JWT的使用

服务器签发JWT后,发送给客户端,客户端如果是浏览器的话,可以将其存放在cookie或localStorage中,如果是APP的话,则可以存放在sqlite数据库中。

然后每一次接口请求时都带上JWT,而带上来给服务端的方式,也有很多种,比如query、cookie、header或者body,总之就是一切可以带上数据给服务器的方式都可以,但比较规范的做还是通过header Au

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache2.4和PHP8的量子纠缠

Apache不建议你用,PHP建议使用

二进制部署k8s---下篇

一 master02 节点部署 1 先在master01 添加映射master02 对master02进行环境初始化 3 从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点 scp -r /opt/etcd/ root192.168.11.12:/opt/ scp -r /opt/kubernetes/ root192.168.11.12:/opt…

scanf读取标准输入

内容 scanf函数的原理 多种数据类型混合输入 常用的数据输入/输出函数 程序员可以给程序输入数据,程序处理后会返回一个输出。C语言通过函数库读取标准输入,然后通过对应函数处理将结果打印到屏幕上,printf函数可以将结果打印到屏幕上。下…

中国品牌日 | 紫光展锐以科技创新驱动品牌价值 提升全球竞争力

5月10日至5月14日,以“中国品牌,世界共享;国货潮牌,品筑未来”为主题的第八届中国品牌日活动在上海世博展览馆举行。该活动由国家发展改革委联合国务院国资委、市场监管总局、国家知识产权局共同主办,聚焦新经济新消费…

高通QCS6490开发(一): 广翼智联FV01 AI板卡简介

《高通QCS6490开发》是一系列AIoT应用开发文章,我们将会在系列文章中陆续介绍基于QCS6490平台上的AIoT应用开发,在文章中,我们选择了广翼智联(FAIOT)公司的FV01产品作为开发板,介绍如何从底层的硬件板卡接线…

JETBRAINS IDES 分享一个2099通用试用码!PhpStorm 2024 版 ,支持一键升级

文章目录 废话不多说上教程:(动画教程 图文教程)一、动画教程激活 与 升级(至最新版本) 二、图文教程 (推荐)Stage 1.下载安装 toolbox-app(全家桶管理工具)Stage 2 : 下…

软考一年只能考一次吗?24软考各科目考试时间一览表

软考考试次数: 软考高级【系统分析师】及【系统架构设计师】是一年考两次的。 此外,软考中级【软件设计师】和【网络工程师】也是一年考两次的。 其他科目一年都只开考一次,或者上半年开考,或者下半年开考,具体考试…

PCIE V3.0物理层协议学习笔记

一、说明 PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。 PCIe属于高速串行点对点双通道高…

私活更好用:SpringBoot开源项目!!【送源码】

今天分享一款非常香的SpringBoot大屏开源项目,非常适合接私活用。 这是一款基于SpringBoot代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design。强…

【永洪BI】资源导出

路径:管理系统>资源部署>资源导出 1.页面介绍 选择左侧面板中的管理系统,点击资源部署,选择资源导出,进入资源导出页面。 【名称】导出的 jar 文件的名称,必填项。 【描述】导出的 jar 文件中包含的描述信息…

Maven依赖管理项目构建

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图(了解) 二、Maven安装和配置1. Mave…

TCP(1)

传输层的两大协议是TCP 和 UDP ,他们在传输数据的时候起到了不可替代的作用。那么什么是TCP呢? 首先TCP是一个网络传输协议,这个协议保证了可靠的数据传输。TCP是面向字节流的,全双工的(也就是通信双方互相发消息&…

【Qt】Qt组件设置背景图片

1. 方法1(paintEvent方式) 使用paintEvent()实现 1. .h文件中添加虚函数 protected:void paintEvent(QPaintEvent *event) override;添加虚函数方法: 选中父类,点击鼠标右键点击重构点击 Insert Virtual Funtion of Base Class…

【C语言】6.C语言VS实用调试技巧(1)

文章目录 1.什么是 bug2.什么是调试(debug)?3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题…

MaxKB创建本地知识库

上节已经可以通过MaxKB创建简单的问答系统了,这节开始做自己的知识库,实际上就是把一些本地文件上传到大模型中,让大模型学会这些文件内容,你在问他问题的时候可以通过此文件的内容来回答你,尤其是在针对特定场景或者特…

MyBatis-Plus简介

一、简介 官网:https://baomidou.com/ MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 二、特性 无侵入:只做增强不做改变,引…

潮玩与游戏的结合点——潮玩宇宙App与链游

本文主要介绍了潮玩宇宙App的开发过程及其链游的开发,探讨了潮玩与游戏的结合点,分析了其市场前景和潜在风险,并提出了相应的建议。 一、潮玩宇宙App的开发背景 随着互联网的普及和人们对娱乐方式的多样化需求,潮玩市场逐渐崛起…

十一.吊打面试官系列-JVM优化-深入JVM类加载机制

前言 从本篇文章开始我们来探讨JVM相关的知识,内容附带JVM的启动,JVM内存模型,JVM垃圾回收机制,JVM参数调优等,跟着文章一步一步走相信你对JVM会有一个不一样的认识,如果觉得文章对你有所帮助请给个好评吧…

Spring事务中的@Transactional注解中的参数说明

目录 注解声明 propagation (事务传播行为) REQUIRED 外部没有事务则创建当前事务 外部有事务则合并(加入)事务​编辑 REQUIRES_NEW 外部没有事务则创建一个事务 外部有事务则将外部事务挂起,内部影响外部,外部不影响…

终于搞懂Linux 设备树中的#address-cells,#size-cells 和reg 属性

目录 一、前置知识 1. 处理器平台2. reg 属性的基本格式3. reg 属性的作用 reg 用法 二、#address-cells 和 #size-cells 属性 1. 示例1 2. 示例23. 示例3 一、前置知识 要理解#address-cells和#size-cell 这两个属性,就要先了解 reg属性。 1. 处理器平台 下…