Session、Cookie和Token
参考:Session、Cookie、Token 【浅谈三者之间的那点事】
HTTP协议是一种无状态协议,即每次服务端接收到客户端请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session和Cookie的主要目的就是为了弥补HTTP的无状态特性。
Session
客户端请求服务端,服务端会为这次请求开辟一块 内存空间,这个对象便是Session对象,存储结构为 ConcurrenthashMap,Session弥补了HTP无状态的特性,服务器可以利用Session存储客户端在同一会话期间的一些操作记录。
session
- 会话,代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续。
- cookie中存放着一个sessionID,请求时会发送这个ID;
- session因为请求(request对象)而产生;
- session是一个容器,可以存放会话过程中的任何对象;
- session的创建与使用总是在服务端,浏览器从来都没有得到过session对象;
- session是一种http存储机制,目的是为武装的http提供持久机制。
Session如何判断是同一条会话
服务器接收到请求时,开辟一块Session空间(创建的Session对象),同时生成一个sessionId,并通过响应头的Set-Cookie:JSESSION=XXXXXX命令,向客户端发送要求设置Cookie的响应;客户端接收到响应后,在本机设置一个 JESSIONID=XXXXXX的Cookie信息,这个Cookie的过期时间为浏览器会话结束;接下来客户端每次的请都会带上这个Cookie信息(包含 sessionId ),然后,服务器通过读取请求头中的 Cookie 信息,获取名称为JESSIONID的值,得到此次请求的sessionId。
Session的缺点
Session机制缺点是,例如在A服务器存储了Session,但又做了负载均衡,假如一段时间内A的访问量剧增,访问会被转发到B服务器,但B没有A的Session,会导致 Session 的失效。
Cookie
HTTP协议中的Cookie包括Web Cookie和浏览器Cookie,它是服务器发送到Web浏览器的一小块数据。服务器发送到浏览器的Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常用于判断两个请求是否来自同一个浏览器,例如用户保持登陆状态。
HTTP Cookie 机制是 HTTP 协议无状态的一种补充和改良
cookie
储存在用户本地终端上的数据,服务器生成,发送给浏览器,下次请求统一网站给服务器。
Cookie 主要用途
- 会话管理
登陆、购物车、游戏得分或者服务器应该记住的其他内容
- 个性化
用户偏好、主题或者其他设置
- 追踪
记录和分析用户行为
token
令牌,是用户身份的验证方式。
最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)。
对Token认证的五点认识
- 一个Token就是一些信息的集合;
- 在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;
- 服务端需要对cookie和HTTP Authrorization Header进行Token信息的检查;
- 基于上一点,你可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;
- 因为token是被签名的,所以我们可以认为一个可以解码认证通过的token是由我们系统发放的,其中带的信息是合法有效的;
cookie与session区别
cookie数据存放在客户端上,session数据放在服务器上;
默认关闭浏览器,session消失
cookie不是很安全,且保存数据有限;
session一定时间内保存在服务器上,当访问增多,占用服务器性能。
session与token
作为身份认证,token安全行比session好;
Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。
token与cookie
Cookie是不允许垮域访问的,但是token是支持的, 前提是传输的用户认证信息通过HTTP头传输;
token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。