cookies 和 session 小议

cookies

cookie 是服务端存放在客户端的一个小东西,用于识别信息,或者暂存信息。一般用于多页面,多域名交互

session

session 是服务端存放在服务端的一个东西,用于识别共同信息。一般用于同一站点识别用户信息,保存用户信息。

用户会话的保持离不开 cookies 和 session,这个前提是web 访问下。但是对于当前移动环境下,cookies 和 sesssion 成了一个瓶颈。

web 下会话保持方式 以 php 语言为例

web 下我们访问一个站点,如果 php 端开启了 session,那么会像客户端发一个 header命令。这个命令就是设置一个 cookie 导浏览器中。一般如果没有作更改那么,这个 cookie的 key 是 PHPSESSID ,值为服务端的 session 信息的 ID。
当我们登录时,这个 ID 就起作用了,她会将用户信息存入到这个 ID 对应的 session 中。而每次请求发起时,浏览器都会自动将 cookie 放入 request 的 header 部分,服务端在接收到请求后会自动检查 cookie 中有没有 PHPSESSID (当然这个事情是 php 的 session 方法 session_start()自动处理的)。session 在得到这个 ID 后,便将sessionId 对应的数据放入变量$_SESSION 中。于是我们才可以用这个变量来判断用户是否登录,用户是谁等等。

核心

可以发现 使用session来确定用户信息,必须与 cookies成对存在方才能有效的解决用户识别。而之所以不单用 cookies 的原因更加不安全。

移动端下遇到的问题

  1. cookie 无法保持。原因:cookie无法保持,移动端在发起请求时不会将 cookie 放入 request 的 header 中。
  2. 服务端因为无法获取到 cookie 不断的生成新的 sessionId 来给后续的请求。
    备注:这里说的移动端一般指的是 原生 APP 和部分无法webview 无法携带 cookie 信息的 hybird app

如何解决

采用类似 cookies 和 session 方式

  1. 最简单的方式就是移动端 写入 cookie 到 header 中。 具体思路就是封装移动端网络请求库,所有的请求走同一个请求库,然后请求库内部在接收到 cookie 后,自行保存,然后在发送请求时,自行携带 cookie。服务器端保持session方式。2. token 方式。生成一个唯一的 token 跟设备信息绑定起来,存入到服务端,每次发起请求时将设备信息打包成 token 发送往服务端。服务端检查 token 来处理用户信息。
  2. 以上两种,需要面对,客户端与服务端信息同步问题。比如服务端已经强制某个用户下线,客户端需要有一个机制来处理这个问题。

采用长连接方式

长连接方式,就是用来保持与服务器连接。
长连接的好处 坏处基本都是大家知晓的。

两种方式共同需要做的

  1. 分布式部署的时候需要解决如何共用 session 或者共用长连接的 fd 的问题
  2. 强制下线的问题
  3. 长连接还要解决断线重连的问题(频繁掉线)
  • Post author: hainuo
  • Post link: userinfo-in-cookies-or-session
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.