彻底搞懂Token、Session和Cookie。

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

1、Token

Token顾名思义就是令牌、凭证、钥匙,只有这把钥匙,你才能打开门。Token一般都是服务端生成,比如一个web系统,用户登录的时候,服务端校验用户名密码通过以后,会生成一个token,同时会生成refreshToken和一个过期时间,然后将refreshToken和token返回给客户端,客户端会将token保存下来,后续所有的请求都会携带这个token。服务端会判断当前token是否存在已经是否过期。如果token不存在或者过期就会拒绝本次请求。如果token过期怎么办?就用refreshToken刷新时间,当然这里可能还有别的方案。比如只生成token,每次请求的时候都刷新过期时间。如果长时间没有刷新过期时间,那token就会过期。

2、Session

彻底搞懂Token、Session和Cookie

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持久等也可以解决上述问题

3、Cookie

彻底搞懂Token、Session和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取出以参数传递。

电脑提速

posted @ 2021-07-19 15:41  wuyuan2011woaini  阅读(383)  评论(0编辑  收藏  举报