session机制解析

来源:互联网 发布:清理后台的软件 编辑:程序博客网 时间:2024/05/22 12:27

1.HTTP

  • 无状态特性,即不要求浏览器在请求中标明自己的身份。
  • 无持久连接,服务器和浏览器之间没有持久的连接用于多个页面之间的访问。

既然HTTP无状态,那如何维护应用程序的状态?cookie即为扩展http而诞生,主要用途就是弥补http的无状态性

1.1 不能用IP标记客户端的原因

  1. 用户通过代理连接,再次连接时,代理服务器分配给他不同的IP时会被标记为不同用户,其实是同一用户。
  2. 很多用户通过同一个路由连接服务器共享1个IP,会被服务器标记为同一用户,其实是不同用户。

2.cookie

cookie看成http的扩展,保存在客户端,主要内容包括:

  • 名字
  • 过期时间
  • 路径和域

有2两http专门负责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共享

  1. 保存在硬盘上的cookie可在不同浏览器进程间工程,如两个IE窗口。
  2. 保存在内存中的cookie不同浏览器处理方不同:
    • IE:使用Ctrl+N或者从文件菜单打开新窗口可共享,其他方式不能
    • FF:所有进程都可共享
    • JavaScriptwindow.open打开的窗口会共享
    • -

3. session

也可将session看成http的扩展,保存在服务器端。因为cookie较多时传递给服务器数据量太大,因此可将大量的cookie内容保存在服务器端,而只在客户端保存其id标识即可,同时,保存在服务器端安全性更高,这就是session,由于保存在服务器端的session也需要在客户端保存1个标识,session大多数情况下依赖cookie

3.1 session创建

不是客户端访问就回创建session,而是服务端程序调用创建session的语句时才会创建,服务器首先检查请求头里是否包含了session-id

  • 包含session-id:服务器按照此session-idsession检索出来用。
  • 不包含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中。
原创粉丝点击