问题引入?
用户来到淘宝网,输入用户名和密码之后点击“登录”后浏览器将认证信息POST给远端的服务器,服务器执行验证逻辑,如果验证通过,则浏览器会跳转到登录成功,在登录成功后,服务器如何验证我们对其他受限制页面的访问呢?因为HTTP协议是无状态的,所以很显然服务器不可能知道我们已经在上一次的HTTP请求中通过了验证。这时候有两种选择:
- 每次请求的时候都带上用户名和密码
- 服务端记住你是合法用户.
第一种方法可是可以,但是一旦这样子客户端受不了,每次都要我输入.服务端同样也受不了,服务端需要去数据库查询用户的合法性。所以就有了第二种方式。
会话管理
步骤 1: 客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常是以 POST 方法把请求发送给服务器。 而这时, 会使用 HTTPS 通信来进行 HTML 表单画面的显示和用户输入数据的发送。
步骤 2: 服务器会发放用以识别用户的 Session ID。 通过验证从客户端发送过来的登录信息进行身份认证, 然后把用户的认证状态与Session ID 绑定后记录在服务器端。
步骤 3: 客户端接收到从服务器端发来的 Session ID 后, 会将其作为 Cookie 保存在本地。 下次向服务器发送请求时, 浏览器会自动发送 Cookie, 所以 Session ID 也随之发送到服务器。 服务器端可通过验证接收到的 Session ID 识别用户和其认证状态。
不要混淆 session 和 session 实现。本来 session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。 而 cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端无状态实现。而我们今天常说的 “session”,是为了绕开 cookie 的各种限制,通常借助 cookie 本身和后端存储实现的,一种更高级的会话状态实现。所以 cookie 和 session,你可以认为是同一层次的概念,也可以认为是不同层次的概念。具体到实现,session 因为 session id 的存在,通常要借助 cookie 实现,但这并非必要,只能说是通用性较好的一种实现方案。
总结
Session(ID) 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie 是客户端保存用户信息的一种机制,存储在用户本地终端上的数据,用来记录用户的一些信息,也是实现 Session(会话) 的一种方式。
实例
所以如果你去外面连接了不安全的网络,session就被劫持了,就可以模拟你的用户来干各种坏坏的事情。
网友评论