简介

web中一个重要部分就是如何做好用户的整个浏览过程的控制,因为HTTP是无状态的,因此确定哪些连接与用户有关,经典的解决方案是cookie和session。cookie是客户端机制,将用户数据保存在客户端,而session机制是服务器端机制,服务器使用类似于散列表的结构来保存信息。每一个访客都有一个唯一的标志符,即sessionID。要么经过url传递,要么保存在客户端的cookies里。也可以将session保存在数据库里。

由于HTTP的无状态性,一次登陆后的请求并不能知道以前已经登陆过了,但是也不能每次请求都携带登陆账号和密码,所以需要采用cookie和session机制,来在服务器或者客户端保存一些类似的可以代表身份的信息。

cookie,在本地计算机保存一些用户操作的历史信息(比如登陆信息),用户再次访问时候浏览器通过HTTP协议将本地cookie内容发送给服务器,从而完成验证或者上一步操作。

session,是服务器上保存用户操作的历史信息,服务器使用sessionID来标识session。sessionID由服务器产生,随机而且唯一。但是仍然需要将发送请求的客户端和session对应,因此可以借助cookie机制来获取客户端的标识(sessionID),也可以通过get方式将id发送给服务器。

用户每次访问站点的时候,web应用程序都可以读取cookie包含的信息。cookie是有时间限制的,有两种,会话cookie和持久cookie。

session

session指用来在客户端和服务器端之间保持状态的解决方案。也可以指这种方案的存储结构。

首先程序需要为某个客户端请求创建一个session时候,服务器首先检查这个客户端的请求里是否包含了一个sessionID,如果有,则说明已经创建过session,服务器就按照sessionID将session检索出来使用,如果检索不到,就创建一个。如果没有也创建一个。这个sessionID会在本次响应中返回给客户端保存。

总结

session通过cookie,在客户端保存sessionID。而降用户其他会话消息保存在服务端的session对象中。cookie需要将所有信息保存在客户端。但是cookie可能有安全隐患,比如cookie中的用户名密码被破译,或者cookie被其他应用获取。

使用session

创建

服务器为每个会话维护一份信息数据,客户端和服务器依靠一个全局唯一标识来访问数据。

  • 生成一个sessionID
  • 开辟数据存储空间,一般是内存中创建数据结构,但是为了持久化,也可以在数据库中
  • 将sessionID发送给客户端。

发送给客户端有两种方式:

  • Set-cookie就可以将session的标识发送给客户端
  • url重写,这种方式在客户端禁用cookie的时候有用。

预防session劫持

客户端和服务器通过sessionID来维护会话,但是这个标识符很容易被劫持并被攻击。

解决方案:

  • sessionID只允许cookie设置,而不能通过url重写方式,同时设置cookie的httponly为true,这个属性设置是否可以通过客户端脚本访问这个cookie,防止被XSS劫持。
  • 在每个请求中加入token,即每次收到请求都会验证这个token,保证用户请求是唯一的。

另外一种方案是,间隔生成新的sessionID。