(2022.05.24 Tues)
HTTP作为无状态协议(stateless protocol),在服务器端不保存客户端信息,因而对于服务器端来说,接收到的不同请求是独立的,服务器端无法判断相邻的请求是否来自同一个客户端。同时服务器端不维护/保存客户端信息。而对于需要将来自同一客户端的不同请求联系在一起的场景和应用来说,无状态特性显然并不方便。
因此引入cookie和session用于记录用户信息。
Cookie
Cookie是保留在客户端client的一段信息。客户端与服务器首次连接时,客户端的请求报文中不含cookie,而服务器的第一次响应报文header中会包含cookie信息,即Set-Cookie: <cookie-name>=<cookie-value>
,信息以key-value对的形式保存。客户端保留此cookie信息,在之后向服务器发送请求的时候在header加入cookie信息。服务器可依据cookie信息做出有针对性的响应。客户端的浏览器可以禁止cookie使用。Cookie最大只有4KB,浏览器端可保留上百个。
Cookie的作用
会话管理(session management)
登录、购物车、游戏分数以及需要服务器记录的其他信息
定制化
用户喜好、主题和其他设定
追踪
记录和分析用户行为
Cookie初始化和使用
Set-Cookie
信息中除了包含key-value对,还可以包括过期时间(Expires
)、存活时长(Max-Age
)、cookie发往的域名(Domain
)和路径(Path
)、是否使用HTTPS协议(Secure
/HttpOnly
)等。如下面案例
Set-Cookie: SessionID=38afes7a8; Max-Age=259200; Domain=somecompany.co.uk; Path=/docs;Secure
在这个cookie中,指定了sessionid,最大存活时间(秒),域名,和是否使用HTTPS。
如果没有指定Max-Age
或Expires
,则该cookie被认为是永久的,成为一个session-cookie,只有在客户端或客户端浏览器关闭时才会删除/退出该cookie,也就是结束session。当指定的时间到达之后,该cookie在浏览器上被删除。
该cookie也指定了域名,如果服务器的域名与cookie中的域名不同,则服务器拒绝接收该cookie。
该cookie还有一个Secure
标志,此标志出现代表着客户端只使用HTTPS协议向服务器发送cookie,man-in-the-middle攻击对该cookie无效。但注意该cookie在客户端仍然可被其他浏览器访问。
该cookie中还有Path=/docs
标志,指定了在host上可以访问的路径,比如/docs
,/docs/web
,/docs/hs
等等由Path
指定路径和次级路径。
浏览器向服务器返回信息的header中需要加入Cookie
字段,如
Cookie: SessionID=38afes7a8
Cookie的不安全性
客户端的cookie并不非常安全,客户端的其他浏览器可读取/分享cookie文件。
Session会话
session在服务器端临时保存用户信息用于跨页面的访问,是活跃活动的总时间。用户session始于登录终于退出或关闭浏览器,之后session被自动删除。当然可以将session保存在数据库中避免用户信息丢失。前面提到的cookie是服务器用于实现session的工具,cookie中保存session的唯一标识符,如SessionID
之类的。session较cookie更加安全,因保存在服务器端,被加密/存为二进制形式。因session的安全性,在配合cookie使用时,session保存更关键和不可泄露信息,cookie保存其他信息。
对每个用户来说,session是独一无二的。
服务器上session没有个数限制,但是过多显然影响服务器性能。
Cookie Vs. Session
feature | Cookie | Session |
---|---|---|
存放位置 | client | server |
安全性 | 不安全 | 加密、安全 |
容量 | <4KB | 无限制 |
格式 | 字符 | 任意格式 |
另外,session取决于cookie,而cookie不依赖于session,比如session需要读取cookie的SessionID,如果client浏览器禁用cookie则只能通过在URL中传递sessionid实现,否则服务器端无法保留session。session和cookie的消失取决于cookie中的过期日期,或用户是否退出,或关闭浏览器。
网友评论