为什么需要cookie session token
-
1、http是无状态协议,他不会去记住或者认识是谁正在访问它,对于大型电商平台,需要区分每一个用户才可以把他们需要的东西加入他们的购物车。因此先辈们发明的cookie。
-
2、当用户访问了服务器,服务器就会生成一个cookie_id并传给浏览器保存,下一次访问服务器的时候就会携带这个cookie中有登录信息。传输给服务器后,服务器处理以下就可以判断区分用户了。但是cookie是保存在浏览器的那么就会有安全性问题。这是先辈们有引入了session。
-
3、每当用户与服务器建立一次链接就形成了session,这个session data会保存在服务器中,这个session记录着你的登录信息。同时还会生成一个session id 这个会被存放在浏览器的cookie中,等到下一次建立链接的时候会随着cookie被发送到服务端,服务端中就会将session_id 与session_data关联起来。区分用户,但是这种还是不够好,如果有负载均衡器那么与之链接的服务器可能是一个新的服务器,那么就无法建立链接,这时我们使用了token。
-
4、当用户与服务器建立链接服务器就会生成一个存放用户id的token返回给客户端的并存放在cookie,sessionstorage等中。当用户再次请求的时候,这个token就会被放在http header中。这个token可以在服务端进行一个签名,token会进行HMAC-SHA256算法,再加上一个只有我知道的密钥对数据进行一个签名。当token返回的时候我们就对token中的数据使用相同的HMAC-SHA256算法,在加上我们自己知道的密钥。两者进行对比如果相等就说明数据没有被更改过。
cookie
- 什么是cookie
HTTP cookie是服务器发送到用户浏览器并保存在本地的一小块数据。他会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。通常,它用于告知服务器端上。
http协议是一个无状态协议,他不会记录用户的信息。这是我们需要使用cookie来储存用户的信息。
cookie中的信息是存储在浏览器中的,因此只能存储一些非铭感信息。
session
为了解决cookie的问题,我们引入session。超市 - 电子柜 - 消费者电子柜(服务端) 给你一个凭证(cookie)凭证是唯一的,不可重复,一点丢失,不可找回。 你(客户端)express-session这个插件。
//添加session
req.session.user = user
//读取session
req.session.user
//删除session
req.session.user = null
delete req.session.user
session:当有大量用户太消耗服务器的性能。
token
token的组成:
-
1、header:在转为Base64编码
-
2、类型:JWT
-
3、算法:HS256
-
4、payload:会配置一些token的基本信息。在转为Base64编码
-
5、singnature:对 header + payload + 密钥 进行HS256算法加密,在转为Base64编码
token = header的Base64.payload的Base64.singnature的Base64
完成上面3部分就生成了一个token了,这个token会被返回给客户端并保存,每次请求都会携带这个token,服务器对token中的header、payload进行转码,然后从新重复第三步,如果返回的结果与携带过来的一致,那么就认为用户已经登录了。