JWT的由来

文章介绍了单体架构中请求的无状态性和数据共享问题,探讨了使用cookie和session作为解决方案,以及session的安全性和工作原理。随着用户量增加和前后端分离的发展,session技术的局限性显现,引出了Token和JWT(JsonWebToken)作为更优的身份验证和信息交换方式,强调JWT在授权和信息安全性上的优势。
摘要由CSDN通过智能技术生成

什么是单体架构

  • 就是把所有的数据的管理和处理都交由服务端来完成。
  • 把路由的处理和资源访问都由服务端来定义和规范,用户只需要按照服务端定义的路由,可以找到服务端的资源(数据库数据,文件)。思考:请求之间数据如何共享?

请求和请求之间的数据如何共享?

请求响应的过程

  • 发起一个请求和响应一个请求,整个过程是无状态(一个请求:go语言会开辟一个线程(协程)去执行请求)。如果request到response结束了。线程肯定要么回收,要么就是被销毁。在整个请求线程数据是无状态就不会任何的保留。
  • 比如登录:用户输入账号和密码,点击登录按钮,请求服务端,把用户查询数据查询出来,显示到页面。那么这里查询出来的用户数据,是不可能维持状态,也就说这个用户信息只能在当前登录请求才会看的到。另外一个请求是获取不到该用户信息的。
  • 那么就出现一个问题。请求和请求的数据共享。你怎么实现?

如果不解决请求响应之间的数据共享出现的问题

  • 某用户,发起登录请求开启一个线程(协程),在执行登录之后,跳转到了首页,显示当前用户信息。
  • 该用户在首页进行商品购买,这里又会开启一个线程,执行购买的服务方法,这个时候服务器必须要知道,是谁在执行的这个操作。
    所以这里你必须要获取你前面的登录信息,这样才可以锁定用户。

解决方法: 客户端cookie存储

  • 每次请求之前都执行一次登录。这样太繁琐,不行!
  • 可以把用户信息返回浏览器,使用浏览器的存储技术(cookie)然后把登录用户信息放入cookie。然后在每次请求的时候把userId携带上。例如: http://www.xxxx.com/course/buy/100?userId=100 但是这样不安全!
    所以这里才会出现更加安全的服务端存储。

服务端的技术存储技术—session

session定义和由来

  • session ---- 是一种所有请求之间的数据共享机制,为什么会出现session,是因为http请求是一种无状态。无状态:用户在浏览器输入方位地址的时候,地址请求到服务区,到响应服务,并不会存储任何数据在客户端或者服务端。
  • 一次request—response就意味着内存消亡,也就以为整个过程请求和响应过程结束。
  • 在开发中,我们可能要存存储一些信息,让各个请求之间进行共享。所有就出现了session会话机制。

session为什么是安全的。

服务端是把数据写到操作系统的内存中的。除非你能把服务器攻破。并且对go操作内存你才能攻破,所以存在在服务端是非常安全的。

session的底层原理

  • 底层: map[string]map[string]any
session.Set("user", "xiaowang") //map[sessionid] == map[user][feige]
session.Save()
  • 这里的sessionid就是确定用户的一个标识
  • save就是将信息存储到内存当中。

sessionid标识用户出现的问题

  • sessionid是一串非常长的字符串,如果我们使用它,就是将它放在地址栏当中,这样请求会给请求地址造成臃肿而且非常的不方便。
  • sessionid解决办法,使用header技术。
    就是说,你只要在服务端把一些数据信息写入http的响应头中,未来你只要发起新的请求,它们都会把响应头的这部分header信息,传递给服务端(标识用户)。

header技术

  • header其实就另外一种request和response直接参数传递一种机制,而机制在请求会自动把你在header存放的参数全部会携带给服务端。
  • 从而解决sessionid传递的问题。就不需要使用参数的方式来暴露出来,从而转变成了一种隐式传递参数的一种方式。
  • 未来如果你想把一些数据不想用参数传递,你也可以使用header来传递
  • 服务端可以把一些信息写入header,然后用js的来获取header信息。

session技术真的好吗?

  • 在一些小型的项目,这种存储的方式当然是好用的,因为只用把信息放入内存中,用户量小的情况下,内存的消耗就可以忽略不计,但是当用户数量多的时候,我们就不应该用这种技术。
  • 在前后端分离的架构中,我们也不能使用session技术,因为前后端分离是不同端口之前的请求和响应,由于跨域问题,session无法传递到后端 。需要通过一些手段来解决跨域问题,例如使用nginx反向代理代理到同一个域下。
    为了解决以上出现的问题,我们就不得不了解Token技术。

Token

  • token的意思是“令牌”,是用户身份的验证方式,最简单的token组成: uid(用户唯一标识)+time(当前时间戳)+sign(签名,由token的前几位+盐以哈希算法压缩成一定长度的十六进制字符串),同时还可以将不变的参数也放进token
  • 这里我们主要想讲的就是Json Web Token,也就是本篇的主题:JWT

Json-Web-Token(JWT)介绍

一般而言,用户注册登陆后会生成一个jwt token返回给浏览器,浏览器向服务端请求数据时携带token,服务器端使用signature中定义的方式进行解码,进而对token进行解析和验证。

JWT Token组成部分

str = “[header].[payload].[signature]”

  • header: 用来指定使用的算法(HMAC SHA256 RSA)和token类型(如JWT)
  • payload: 包含声明(要求),声明通常是用户信息或其他数据的声明,比如用户id,名称,邮箱等. 声明可分为三种: registered,public,private
  • signature: 用来保证JWT的真实性,可以使用不同的算法

JWT做的事情

就是让服务端做两件事:1、生成token2、解析token

JWT解决的问题

  • Authorization(授权): 典型场景,用户请求的token中包含了该令牌允许的路由,服务和资源。单点登录其实就是现在广泛使用JWT的一个特性(接口的安全性)
  • Information Exchange(信息交换): 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式.因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。
    接下来就是使用JWT待续。。。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值