未完待续
Cookie vs Session
首先要知道,cookie和session是无法放在一起对比的,因为他们维度不同
-
cookie 是一个
实际存在的东西
, http 协议中定义在header
中的字段。 -
session
session是一个抽象概念,指客户端与服务端维持的一个有状态会话
开发者为了实现中断和继续
等操作,将client和 server
之间一对一的交互
,抽象为“会话”,
进而衍生出“会话状态”
,也就是session
的概念。
具体到实现,session 因为 session id
的存在,通常要借助 cookie来实现,但不是唯一的实现方式。只能说是通用性较好的一种实现方案。如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url
中传递 session_id
)
区别
-
安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。所以session不会任意读取客户存储的信息
-
存取值的类型不同:
Cookie 只支持存字符串
数据,Session 可以存任意数据类型
。 -
有效期不同: Cookie 可设置为长时间保持,而Session 一般失效时间较短。
-
存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储的数据量远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
cookie+session工作原理
- 用户
第一次请求服务器
的时候,服务器根据用户提交的相关信息,创建对应的 Session - 请求返回时,将此 Session 的
唯一标识信息 SessionID
一并返回给浏览器。 - 浏览器接收到服务器返回的
SessionID
后,会将它存入到 Cookie 中
,同时 Cookie 记录此SessionID 属于哪个域名
- 当用户
再次访问服务器
的时候,会自动将 Cookie 信息发送给服务端,服务端会从 Cookie 中获取 SessionID
,服务端会根据 SessionID 查找对应的Session 信息
。
Cookie
为什么需要Cookie?
因为HTTP是无状态的协议(每个请求都是完全独立的)
所以浏览器每次请求服务器都需要验证自己的身份,cookie类似身份证用于证明用户的身份。有效降低验证身份的复杂度。
缺点
Cookie字符串的长度有限制。超过会被截掉。
安全性问题
因为存储在客户端,容易被篡改,所以不能存储敏感数据,比如用户密码,账户余额。
Session
什么是Session(会话)?
客户端访问服务器的 整个过程
称之为一个会话
,session就是记录服务器和客户端会话状态
的机制。
session存储了用户的本次会话的信息,当用户访问服务器时可以直接取出session中的数据进行使用。
session默认失效时间是30分钟。
session 实现方式
session 一般是基于 cookie 实现,session
存储在服务器端,sessionId
会被存储到客户端的cookie
中,随cookie发送到服务器端。
如果客户禁用cookie怎么办?
当客户端浏览器禁用cookie时,sessionId也可以放在URL
中返回给服务器
session 缺点:
-
时效有限
关闭浏览器之后,Cookie失效,SessionID随之丢失,就找不到上一次登录的Session了,那么下次登录就需要重新创建Session
所以session只能够保证本次会话的免登录,无法实现例如半个月免登。 -
session占用内存过多问题
由于session 存储在服务器里面,当用户同时在线量比较多时,这些 session 会占据较多的内存,需要在服务端定期的去清理过期的 session -
分布式session共享问题
当网站采用集群部署
的时候,session 可能是由A服务器创建的,但是处理用户请求的服务器可能是B,那么B服务器是无法拿到存在A服务器的session信息的
如何解决分布式session共享问题?
分布式缓存:用redis存储session信息。每台服务器都到redis拿数据
自己的一点思考
只要关闭浏览器 ,session 真的就消失了?
没有消失。对 session 来说,除非程序通知服务器删除一个 session,否则服务器会一直保留。
恰恰是由于关闭浏览器不会导致 session 被删除,迫使服务器为 session 设置了一个失效时间,当距离客户端上一次使用 session 的时间超过这个失效时间时,服务器就认为客户端已经停止了活动,才会把 session 删除以节省存储空间。