解决会话状态方案中Token、Session和Cookie区别不同点

Cookie、Session和 Token对于从事 Web后端开发的程序员来说并不陌生,它们都是会话状态的一种解决方案。Http协议无状态的特点导致程序无法区分多次请求是否是同一个用户发起,所以,我们就用token、session和 cookie的技术来解决无状态的问题。

Token

一、Token

Token顾名思义就是令牌、凭证、钥匙,只有这把钥匙,你才能打开门。Token一般都是服务端生成,比如一个 web系统,用户登录的时候,服务端校验用户名密码通过以后,会生成一个token,同时会生成 refreshToken和一个过期时间,然后将 refreshToken和token返回给客户端,客户端会将 token保存下来,后续所有的请求都会携带这个token。

服务端会判断当前 token是否存在已经是否过期。如果 token不存在或者过期就会拒绝本次请求。如果 token过期怎么办?就用 refreshToken刷新时间,当然这里可能还有别的方案。比如只生成token,每次请求的时候都刷新过期时间。如果长时间没有刷新过期时间,那 token就会过期。

Session

二、Session

session就是会话,这是服务端的一种操作。当你第一次访问一个web网站的时候,服务端会生成一个session,并有一个sessionid和他对应。这个session是存储到内存中的,你可以向这个session中写入信息,比如当前登录用户的信息。sessionid会被返回到客户端,客户端一般采用cookie来保存。

当然这个 cookie不用人为写入。用 tomcat容器来举个例子。当后端调用 HttpServletRequest对象的 getSession的方法的时候,tomcat内部会生成一个 jsessonid(tomcat sessionid的叫法)。这个 jsessonid会随本次请求返回给客户端。响应头信息:

HTTP/1.1 200 OK

Set-Cookie: JSESSIONID=xxxxxxxxxxxxxxxxxxx

这个 jessionid就会写到 cookie中。之后 jessionid就会通过 cookie传递到服务端。

这里我们就会很清楚了,session的数据是存储到内存中,那问题就来了,如果我们的服务是分布式部署,有多台机器的话,可能我们第一次登陆的时候,我们把用户的信息存储到了session,但是后面的请求到了B机器上,那B机器是获取不到用户的session的。

另外就是 session存储在内存中,那服务器重启,session就丢失了,这就是它的弊端。现在有一些技术,例如 session共享、iphash、session持久等也可以解决上述问题

Cookie

三、Cookie

cookie是浏览器的一种策略。上述讲到了 sessionid就是存储在 cookie中的。我们知道 http协议是无状态的,cookie就是用来解决这个问题的。cookie中可以用来保存服务端返回的一些用户信息的,例如前文提到的 token、sessionid。每一次的请求,都会携带这些cookie。服务端从请求头中取到cookie中的信息,就可以识别本次请求的来源,这样 http是不是就变成有状态的了。

这里说几点 cookie注意事项:

  1. cookie存放在客户端,所以是不安全的,人为可以清除;
  2. cookie有过期时间设定。如果不设置过期时间,说明这个cookie就是当前浏览器的会话时间,浏览器关了,cookie就不存在了。如果有过期时间,cookie就会存储到硬盘上,浏览器关闭不影响cookie。下次打开浏览器,cookie还存在;
  3. cookie有大小的限制,4KB。

最后对于一个分布式的 web系统,通用的解决方案就是 cookie+token。由服务端生成 token,将用户信息与 token进行关联,token返回给浏览器,存储到 cookie中。后续请求都携带 cooke或者将 token从 cookie取出以参数传递。

 

转载请注明链接地址:荐爱小站 » 解决会话状态方案中Token、Session和Cookie区别不同点

赞 (0) 赏 !

觉得文章有用就打赏一下吧,赠人玫瑰手有余香!

支付宝扫一扫打赏

微信扫一扫打赏