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 是存在后端的,别人是获取不到的。