1.HTTP
- 无状态特性,即不要求浏览器在请求中标明自己的身份。
- 无持久连接,服务器和浏览器之间没有持久的连接用于多个页面之间的访问。
既然HTTP无状态,那如何维护应用程序的状态?
cookie
即为扩展http
而诞生,主要用途就是弥补http
的无状态性。
1.1 不能用IP标记客户端的原因
- 用户通过代理连接,再次连接时,代理服务器分配给他不同的IP时会被标记为不同用户,其实是同一用户。
- 很多用户通过同一个路由连接服务器共享1个
IP
,会被服务器标记为同一用户,其实是不同用户。
2.cookie
将cookie
看成http
的扩展,保存在客户端,主要内容包括:
- 名字
- 值
- 过期时间
- 路径和域
有2两http专门负责cookie
2.1.响应头Set-Cookie
响应头
Set-Cookie
指示客户端建立cookie
,后续请求将此cookie携带在请求头中发送给服务器端直到cookie
过期。
响应头举例:
HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8;
expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html
2.2.请求头cookie
请求头中携带的,两种保存方式:
1. 不设置cookie
过期时间时cookie
的生存周期是整个回话期间,浏览器将其保存在内存中,浏览器关闭时将清除此会话cookie
。
2. 设置cookie
过期时间时cookie
保存在客户端的硬盘中,浏览器关闭不清除,下次打开网站时还会自动发送。
2.3. 客户端脚本生成cookie
document.setCookie(`key=a;value=b;expires=new Date().toString+10000;url=www.abc.com`)
2.4. cookie共享
- 保存在硬盘上的cookie可在不同浏览器进程间工程,如两个IE窗口。
- 保存在内存中的cookie不同浏览器处理方不同:
- IE:使用
Ctrl+N
或者从文件菜单打开新窗口可共享,其他方式不能- FF:所有进程都可共享
- 用
JavaScript
的window.open
打开的窗口会共享- -
3. session
也可将
session
看成http
的扩展,保存在服务器端。因为cookie
较多时传递给服务器数据量太大,因此可将大量的cookie
内容保存在服务器端,而只在客户端保存其id
标识即可,同时,保存在服务器端安全性更高,这就是session
,由于保存在服务器端的session
也需要在客户端保存1个标识,session
大多数情况下依赖cookie
。
3.1 session
创建
不是客户端访问就回创建
session
,而是服务端程序调用创建session
的语句时才会创建,服务器首先检查请求头里是否包含了session-id
:
- 包含
session-id
:服务器按照此session-id
把session
检索出来用。 - 不包含
session-id:
服务器创建一个session
并为其生成相关联的session-id,
将此session-id
放在响应头中。
3.2 session-id
如何发送给服务器?
cookie
形式,包含在请求头的cookie
参数中- 在禁用
cookie
时,可通过URL
参数(查询参数或者路径参数)传递(不安全,用户可能会分享URL
,若session-id
未过期则不安全),所有的路径后面都需包含这个session-id
3.2 session
何时被删除?
除非程序通知服务器删除
session
,否则会一直保留。 程序一般在用户点击退出时删除会话cookie
保存的session-id
,服务器不会知道浏览器何时关闭,这种错觉来源于会话cookie
保存session-id
,浏览器关闭后session-id
消失,再次连接服务器时,若上次用硬盘保存session-id
或者其他方式获得session-id,
将session-id
发送给服务器,则仍能找回原来的session
。
3.2.1 服务器端设置的session
了失效时间到
由于浏览器关闭不会导致
session
被删除,因此,服务器为session
设置了失效时间,时间到才会删除session
。
3.2.2 服务器进程停止
会话
session
保存在服务器进程的内存中,若服务器进程终止的话,会话session
会消失。
3.3 session
安全性增强
通过
GET
请求或者转发URL
都可能使攻击者得到session-id
,若将其当做请求头发送给服务器,则服务器会将其当成合法用户。
User-Agent
变了,让重新输入密码进行登录- 在用户第一次登录时将
User-Agent
信息放在session-id
中。