会话
Cookie 与 Session 的比喻
cookie:饼干 -》 我给你
Session:会话 -》 交流
含义
用户打开一个浏览器,点击了很多超链接,访问了多个web资源,然后关闭浏览器,这个过程称为会话
(浏览器从打开到关闭整个过程)
有状态会话
含义:以登录状态进行会话
疑问:如何证明自己的身份(登录状态)
处理方案:
- 服务端给客户端一个身份信息,客户端携带身份信息来就可以;——cookie
- 服务端登记客户端身份,下次来时匹配他;——session
保存会话状态的两种技术
cookie
特点
-
客户端技术
- 主要储存了一些数据,类中伴随着对应的get、set方法,
- 从req中获取((getCookie)向resp放入(addCookie)
-
可在浏览器application - storage - cookie 或 request-header 查看
-
设置有效期的情况下,浏览器关掉还可保存在本地的用户目录下的appdata中
流程
- 从请求req拿到cookie
- 服务器向响应resp中写入cookie
细节
- 一个cookie只能保存一个信息,其他变量都是配置信息
- cookie大小限制为4kb
- 一个web站点可以给浏览器发送多个cookie,最多20
- 浏览器的cookie上限为300
session *
特点:
-
服务器技术,可以保存用户的会话信息,把信息或数据放在session中
-
服务器会给每个用户(浏览器)创建一个seesion对象
-
一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
-
用户登录后,整个网站都可访问 ——》 保存用户信息、保存购物车信息
-
可以实现不同servlet中的数据共享,用于实现有状态的会话机制
操作
- 获取唯一标识:session.getId()
- 存东西:session.setAttribute(“key”, “value”);
- 是否为新创建:session.isNew()——比较刚刚存在/之前就已存在
- 手动注销:session.invalidate()
要点
- session创建时会将id赋给cookie,key为JSESSIONID,即(“JSESSIONID”, sessionId)
- 注销方式
- 手动注销:session.invalidate()
- 统一配置失效时间:session-config -》 session-timeout
session与cookie区别
- cookie把用户数据给浏览器保存
- session对象由服务器保存,用户数据保存在服务器,sessionId放在cookie给用户,通过id独占session
- session对象由服务器创建
后续发展
采用cookie+session机制保存登录状态
– (集群下在各服务器上如何保持登录状态) --》 session复制
– (服务器性能、内存影响很大) --》 session集中存储,缓存集群等
– (维护不易,为什么要在服务端维护session呢,只让客户端去维护是否可以?) --》基于token的身份验证,服务端对token做校验,验证token是否为伪造
JWT
概念
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。
JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输
JWT构成
header(指明加密方式,jwt类型). payload(承载信息) . header+payload+secret加密后字符串(用于前两者+secret后加密验证)
使用方法
客户端携带token访问,服务器只需验证token是自己生成,而非伪造即可。
验证使用header+payload+secret加密后与jwt的第三部分比较是否一致即可(其中secret为服务端所持有的密钥)。