cookie 和 session 的区别

以我自己做的个人博客来说明两者的区别,由于 HTTP 协议是无状态的协议(也就是服务端不能仅仅通过 http 请求本身来判断是哪一个用户),所以就需要一种机制来判断当前是哪一个用户登录了博客。

我在博客项目中是这样实现的:

在用户第一次请求我的网站的时候,我会在响应头中通过设置 set-cookie 给客户端的 cookie 中加一个 sessionId.

res.setHeader('Set-Cookie', `sessionid=${sessionId}; path=/; htppOnly; expires=${getCookieExpires()}`);

当用户再次请求我的网站的时候,携带的 cookie 中就会有 sessionId,当用户登录成功后在 session(后端程序中的一个对象)的 sessionId 属性中设置一个 username,然后根据这个 username 来判断当前用户是谁,是否处于登录状态。

所以,总结一下:

session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在数据库,文件中,在博客项目中将 session 保存在了 redis 中。

cookie 是客户端保存信息的一种方式,它是一个字符串,主要是用来做前后端通信的。

几个问题:

1)为什么使用 cookie 中的 userId,而不是直接根据用户的请求就创建一个 session?

实现起来不方便,后端如果判断是不是一个用户在发送请求呢?难道一个用户每次发出一个请求之后都创建一个 session 吗?或许可以通过在登录的时候通过获取到用户名,然后将其写入到 session 中,但是下一次请求如何知道是这个用户呢?一个可行的方案是在每次请求的 url 中都加一个 username 的参数,可是这样既不安全也比较麻烦。

所以借助 cookie 来配合 session 是现在比较常见的方案。

2)直接在 cookie 中存放用户名不可以吗?

可以,但是不安全,如果 cookie 被窃取了,那么用户名就被别人知道了,用户名有可能就是你的电话号码,你可能并不想让别人知道。而 session 是存在后端的,别人是获取不到的。

版权声明:本文为zhangguicheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangguicheng/p/12845397.html