什么是单体架构
- 就是把所有的数据的管理和处理都交由服务端来完成。
- 把路由的处理和资源访问都由服务端来定义和规范,用户只需要按照服务端定义的路由,可以找到服务端的资源(数据库数据,文件)。思考:请求之间数据如何共享?
请求和请求之间的数据如何共享?
请求响应的过程
- 发起一个请求和响应一个请求,整个过程是无状态(一个请求: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待续。。。