Token顾名思义就是令牌、凭证、钥匙。只有这把钥匙,你才能打开门。token一般都是服务端生成,比如一个web系统,用户登录的时候,服务端校验用户名密码通过以后,会生成一个token,同时会生成refreshToken和一个过期时间。然后将refreshToken和token返回给客户端。客户端会将token保存下来。后续所有的请求都会携带这个token。服务端会判断当前token是否存在已经是否过期。如果token不存在或者过期就会拒绝本次请求。如果token过期怎么办,就用refreshToken刷新时间。当然这里可能还有别的方案。比如只生成token,每次请求的时候都刷新过期时间。如果长时间没有刷新过期时间,那token就会过期。
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是浏览器的一种策略。上述讲到了sessionid就是存储在COOKIE中的。我们知道http协议是无状态的,COOKIE就是用来解决的。COOKIE中可以用来保存服务端返回的一些用户信息的,例如前文提到的token、sessionid。每一次的请求,都会携带这些COOKIE。服务端从请求头中取到COOKIE中的信息,就可以识别本次请求的来源,这样,http是不是就变成有状态的了。这里说几点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。
Token, 令牌,代表执行某些操作的权利的对象。
token主要用于鉴权使用,主要有以下几类:
COOKIE主要是网站用于在浏览器临时存放的数据,包括浏览器缓存数据以及服务器设定的一些数据,主要存放在浏览器端。
session主要用于保存会话数据,一般存储在服务器端,同时每一条session对用一个sessionID,sessionID是存放在浏览器的COOKIE中。
传统上的会话登陆和鉴权主要用session加COOKIE实现,随着分布式系统的快速演进,尤其是微服务的应用,token+COOKIE的授权访问机制得到亲睐,通常在用户登录后,服务器生成访问令牌(Access token),浏览器存储COOKIE中,在每次请求资源时都会在请求头中带上token,用于服务器授权访问使用。