当前位置: 代码迷 >> 综合 >> cookie、session、sessionId、token、登录
  详细解决方案

cookie、session、sessionId、token、登录

热度:73   发布时间:2023-11-27 20:56:27.0

前言

自己这几天在用node做一个博客系统,包含了登录功能,这个过程中涉及到了一些cookie,session等等,自己就查阅了一些相关资料,以自己的理解做了一些总结,若有不对的地方可以指出。


为什么要使用这些技术?
cookie和session是一种追踪客户端与服务器端通信的一种方式。
我们知道http链接是无状态链接,每次客户端访问服务端,服务端都不会知道访问者是谁,这样的好处就是http设计简单,缺点也显而易见:每次关闭浏览器后又要重新登录。

如何实现记录用户访问?
当用户第一次访问服务器时,在服务器生成一个记录并返回给客户,客户下次再访问时,将上次的记录一并传递到服务器中,这样就实现了会话追踪。

生成的记录如何返回给客户,客户下次访问又如何传递到服务器中?
这就是利用了cookie。cookie是一段存储在浏览器中的文本,它可以保存用户的信息,服务端通过设置返回头的set-cookie字段就能返回给浏览器并保存cookie,浏览器又自动设置请求头的cookie字段将cookie传递给服务器。

既然cookie就能保存用户的信息,那session又是干什么用的?
cookie是保存在浏览器中的,服务器中没有保存,如果我们在浏览器中伪造一个cookie然后传递给服务器,服务器怎么知道cookie是真是假,所以在服务端中也要有一种机制要记录会话信息。
当用户第一次访问服务器时,在服务器中生成记录并保存在session中,然后将这个记录通过cookie返回给浏览器,浏览器下次访问时带上cookie,服务器再通过session验证传过来的cookie是否正确。
另外cookie是存储在浏览器端的,存储的登录信息不够安全任何人都能访问,而存储在服务器端更安全。

sessionId是什么?
上面所说的用户第一次访问会产生一个记录,这个记录就是这次会话的sessionId,sessionId又一cookie的形式传递给浏览器。

总结一下上面的过程:

  1. 用户使用账号密码登录
  2. 服务端验证账号密码是否正确,若正确生成sessionId并以cookie的形式返回给前台
  3. 浏览器保存cookie,并在下次访问自动带上cookie
  4. 服务器在session中匹配前台传过来的cookie,有则不用再登录,否则提示未登录

上面的过程中,有一个弊端就是每一个用户连接都会在服务器端中产生一个sessionId,当用户很多时会导致服务器压力很大,另外当服务器有多台时还有考虑sessionid在这些服务器之间共享。于是就有另一种解决方案:token

基于token的身份验证

  1. 客户端使用用户名和密码请求登录。
  2. 服务端收到请求,验证用户名和密码。
  3. 验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
  4. 客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
  5. 客户端每次向服务端发送请求的时候都需要带上服务端发给的token。
  6. 服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。

其实token验证和sessionId验证很相似,不同的地方就是token不用保存在session中。

token不保存那它是如何验证的?
其实我们就是为了防止其他人伪造登录信息,sessionId保存在session中,通过对比就知道sessionId是否是伪造的,token不保存在session中,那我们在token生成的时候想办法,让其他人无法伪造。

服务端在生成token时,加入少量的用户信息,比如用户的id,我们对数据使用算法加密生成签名添加到token中(加密的密钥只有自己知道)传递给客户端,客户端下次访问时带上token,服务器端通过密钥解析token生成签名,比较两次签名是否相同,若不相同则验证失败。


在这里插入图片描述


总结

上面只是简单的介绍了一下基本原理,具体的实现有很多细节,比如如何防止非法客户端拦截了合法客户端的token,然后使用这个token向服务端发送请求,冒充合法客户端。
以后有机会可以去深入了解


参考链接:

  • 简单理解cookie/session机制
  • 简单理解token机制
  • 彻底理解cookie,session,token
  • Token:服务端身份验证的流行方案
  相关解决方案