浅析 cookie 和 session

173 阅读2分钟

什么是 Cookie

  1. Cookie 是服务器下发给浏览器的一段字符串
  2. 浏览器必须保存这个Cookie(除非用户删除)
  3. 之后发起的相同的二级域名请求时,浏览器必须附上Cookie

上面的话我们可以做一个比喻,Cookie就好比一张门票,只有当你有门票时,游乐场才会允许你进入。

从用户注册登录讲起

  1. 用户注册时浏览器/服务端做了什么 首先,用户注册时,form表单会提交 用户名,密码 给服务器,服务器会将 用户名,密码记录到数据库,同时会创建一个唯一的ID。 以一个json文件比作数据库的话,那么,数据库内就是以下这个形式
[
	{ id:1, name:'jack', password:'123'},
	{ id:2, name:'tom', password:'456'}
]
  1. 用户登录时浏览器/服务端做了什么 当用户登录时,服务端会获取到用户输入的用户名和密码,然后与数据库进行比对,若匹配成功,那么就会跳转到已登录的页面。

如果以上面的逻辑运行,会发现只要我们知道已登录的页面的地址,无论用户是否真的登录了,他都能进入。

此时,我们需要在服务端设置一个Cookie,如果浏览器访问页面时拥有这个Cookie,那么就证明这个用户已经登录了。

其实,用户可以自己通过 js/控制台 修改Cookie,我们可以通过 http-only 来禁止js修改。

如何防止控制台修改我们后面会讲。

  1. 如何实现当用户登录时,显示,你好!jack

我们可以在用户登录时,将用户的id通过Cookie下发给浏览器,页面跳转后,通过id找到username,就可以避免 用户名/密码 暴露的同时,正确识别用户了。

但是将用户的唯一id暴露出去还是非常的危险,只要知道了id,任何人都可以模拟那个用户了。

此时,我们有两种方案

  • 加密id 加密以后,虽然用户id被保护了,但加密以后的Cookie仍然是唯一的,并不能实质上解决问题,此时就需要JWT了。(不了解,此处不做介绍)
  • 使用session 我们可以在用户每次发请求登录时,在服务器运行以下逻辑

创建一个session.json文件,创建一个随机数 randomMath, 通过用户名密码匹配到 id 在session.json中,以以下形式显示

{ session_id:randomMath, use_id:'1' }

然后,将session_id作为Cookie下发,此时,这个Cookie不仅是唯一的,而且用户每次重新登录后,上一次的Cookie都会作废,保证了安全。 (同时也杜绝了用户通过控制台修改Cookie造成的安全隐患)