Cookie 和 Session

一、问题的提出

  当 web 服务器向浏览器发送 web 页面,连接关闭后,服务器端不会记录用户的信息。

  这是由于 HTTP 是无状态协议,无法实现状态管理,即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。

二、cookie

  • cookie 机制采用的是在客户端保持状态的方案
  • cookie 工作机制:用户识别和状态管理
    • 服务器端响应客户端的请求时,会在响应头中设置 set-cookie 的值(NAME、expires、path、domain、Secure、HttpOnly)
    • 浏览器将 cookie 保存下来
    • 下次请求开始,浏览器都会自动将 cookie 发给服务器,服务器就能通过 cookie 中保存的数据确认这是哪个用户了
    • 但是 cookie 能存储的数量有限,一般不超过 4KB;而且 cookie 每次都会携带在请求 header 中,会影响请求性能
  • Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 Javascript 脚本无法获得 Cookie。其主要目的是为了防止跨站脚本攻击(XSS)对 Cookie 的信息获取

三、session

  • session 采用的是在服务器端保持状态的方案,服务器使用一种类似于散列表的结构来保存信息
  • session 工作机制:
    • 当客户端第一次请求 session 对象时,服务器会创建一个 session,并通过算法算出一个 id,用来标识该 session 对象(sessionID 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串),然后将这个 sessionID 返回给客户端保存
    • 下次请求开始,sessionID 会被放置在请求头中发送回来
    • 服务器比较内存中保存的 sessionID 和 cookie 中保存的 sessionID 进行比较,并根据 ID 在内存中找到之前创建的 session 对象,提供给请求使用
  • 保存 sessionID 的方式可以采用 cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发回给服务器;但是由于 cookie 可以被人为的禁止,必须有其他的机制在 cookie 被禁止时也能够把 sessionID 发回服务器:
    • URL 重写:把 sessionID 附加在 URL 路径的后面
      • 作为 URL 路径的附加信息
      • 作为查询字符串附加在 URL 后面
      • 为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个 sessionID
    • 表单隐藏字段(现在已经很少使用)
  • 不是浏览器关闭了,session就消失了
    • 除非程序通知服务器删除一个 session,否则服务器会一直保留。
    • 大部分session机制都使用 cookie 来保存 sessionID,而关闭浏览器后这个 sessionID就消失了,再次连接服务器时也就无法找到原来的 session。
    • 如果服务器设置的 cookie 被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP 请求头,把原来的 sessionID 发送给服务器,则再次打开浏览器仍然能够找到原来的 session

四、cookie 和 session 的异同点

相同点:

  • 解决同一个问题(HTTP无状态管理),都是用来跟踪浏览器用户身份的会话方式

不同点:

  • cookie 采用的是在客户端保持状态的方案,session 采用的是在服务器端保持状态的方案
  • cookie 用于交互时存放在客户端,session 用于交互时存放在服务器端,一般存放在服务器的内存中
  • session 比 cookie 安全。cookie 很容易被别人篡改,被攻击的可能性比较大
  • session 在一定时间内保存在服务器上,访问增多时,会占用服务器的性能,如果主要考虑服务器性能,应当使用 cookie
  • 可以将登陆信息等比较重要的信息放在 session 中,其他信息放在 cookie 中

  

posted @ 2019-07-04 10:54  湛蓝的家  阅读(111)  评论(0)    收藏  举报