认识 Cookie 和 Session

本文介绍了Cookie的基本概念及其在实现自动登录中的作用,并探讨了Cookie的安全隐患。此外,还介绍了Session作为解决方案来提升安全性的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们进入B站首页,无需输入账号密码,甚至不用点登录,我们就自动登陆了,其实这就是Cookie在起作用。


目录

一、初识 Cookie

1、什么是Cookie

2、Cookie有什么用

3、Cookie文件在哪

4、使用Cookie自动登录的过程

(1) 预备知识

(2) 自动登录的过程

二、代码验证Cookie的存在

1、验证Cookie信息保存在浏览器中(认识Set-Cookie属性) 

 2、验证浏览器的请求携带Cookie信息(认识Cookie属性)

三、Cookie文件存在的安全隐患

四、认识Session


一、初识 Cookie

1、什么是Cookie

Cookie可以看作是一个文件,这个文件里保存了用户的私密信息,如登陆某个网站的账号和密码。

2、Cookie有什么用

就像最开始说的,有了Cookie,我们在访问一些网站的时候无需填写账号和密码便可以直接登录,登录一个网站的时候会推荐我们想看的信息,一定程度上提升了用户体验。

3、Cookie文件在哪

http协议并不会保存历史请求,它只关注当前收到的请求,所以可以肯定的是,Cookie文件不在服务端。现在只剩下一个答案,那就是在浏览器中,而且Cookie文件是跟网站绑定的

每次访问B站首页的时候,首页会给我们推荐我们想看的内容;但是访问腾讯新闻首页的时候,可能推荐的内容又不一样,因此,浏览器的每个网站保存了该网站对应的Cookie文件

4、使用Cookie自动登录的过程

(1) 预备知识

http协议:虽然http协议不保存历史请求,但能够识别Cookie信息

浏览器:浏览器的某个网站如果包含Cookie信息,那么在向服务器发送请求的时候会自动携带Cookie信息。

(2) 自动登录的过程

当我们第一次登录B站的时候,我们需要输入账号和密码,登录成功以后,服务端返回网站资源,此时响应头中会包含Set-Cookie属性,浏览器能识别该属性,然后会给这个网站添加Cookie文件。这样的话,该网站就有了对应的Cookie文件了。

后续发送登录请求的时候,请求中就会携带这些Cookie信息(登录的账号和密码),服务端识别到了Cookie,同时验证通过的话,此时服务端就会返回登录以后的页面。

至于有的时候为什么自动登录会失效?答案是Cookie可以设置到期时间 

 

二、代码验证Cookie的存在

在第一次访问某个网站的时候,服务端可以主动给这个网站添加Cookie信息,下一次浏览器再次请求这个网站的时候,就会携带之前添加的Cookie信息。下面我们的验证分为两步,第一步是先给网站添加Cookie信息,在浏览器中查看该网站是否包含了Cookie信息;第二步重新访问这个网站,在服务端查看请求是否包含Cookie信息。

1、验证Cookie信息保存在浏览器中(认识Set-Cookie属性) 

既然要给网站设置Cookie信息,这里就需要认识请求头的Set-Cookie属性了,Set-Cookie属性的值必须是键值对的形式,该属性的使用方式如下:

Set-Cookie: id=gzx\n;
Set-Cookie: passwd=123456\n;    //请求头里可以添加多个Set-Cookie属性

 服务端的局部代码如下:

std::string http_response = "http/1.0 200 OK\n";            //构建响应
http_response += "Set-Cookie: id=gzx\n";                    //设置Cookie信息
http_response += "Set-Cookie: passwd=123456\n";        
http_response += "\n";
    
send(sock,http_response.c_str(),http_response.size(),0);     //服务器发送响应

 2、验证浏览器的请求携带Cookie信息(认识Cookie属性)

接下来需要验证,再次请求这个包含Cookie信息的网站时,发送的请求会携带Cookie信息,此时请求头里就会出现一个Cookie属性,让服务端知道,请求中携带了Cookie信息。我们刷新一下上面的网站,服务端将收到的请求打印出来,我们可以看到Cookie属性包含了我们之前设置的Cookie信息。

三、Cookie文件存在的安全隐患

我们发送的请求其实是可以被第三方拦截或者监听的,因此如果我们发送的请求携带了Cookie,此时第三方就可以获取到我们的Cookie信息,然后以我们的身份访问特定的资源。若我们保存的是用户名和密码这样的私密信息,那么后果就很严重了,因此,一般不会单纯的使用Cookie。

为了应对这种隐患,我们提出了 session,即会话管理,session的核心思路是:既然私密信息保存在浏览器中不安全,那么我们就把私密信息保存在服务端

四、认识Session

为了缓解私密信息泄漏的风险,我们提出了Session,Session也叫会话管理,在用户第一次登录时候,就将用户的私密信息(如账号密码等)存储在服务端。

第一次登录B站的时候,也是需要传递账号和密码的明文信息,此时会在服务端形成一个Session文件用于保存用户的私密信息,响应头中Set-Cookie属性对应的值就是Session文件的id,下面统一称为sessionId。

在后续的登录过程中,浏览器发送请求时,携带的只是sessionId,即便是被拦截了,第三方拿到的也只是sessionId,一定程度上缓解了私密信息泄漏的风险,但风险依然存在。如果第三方带着我们的sessionId去请求对应网站的内容,依然可以请求到。

只不过现在有了手机验证码的存在,即便是有了sessionId,服务端检测到异地登录的话,会要求你输入手机验证码,这样的话就进一步保护了我们的私密信息,不允许第三方轻易登录。

### Cookie、LocalStorage Session 的区别及使用场景 #### 定义与基本特性 Cookie 是一种小型文本文件,由服务器发送到用户的浏览器并存储在客户端上。它主要用于保持用户会话状态以及跨页面传递少量数据[^1]。 LocalStorage 提供了一种更大的存储空间来保存键值对形式的数据,并且这些数据不会因为关闭窗口而消失,除非手动清除或者设置了过期时间[^2]。 SessionStorage 同样用于存储键值对,但它仅限于当前会话期间存在;一旦浏览器标签页被关闭,则所有存储内容都会丢失。 #### 数据容量限制 - **Cookie**: 单个域名下最多可以设置约 20 条记录,每条不超过 4KB 大小。 - **LocalStorage**: 支持更大规模的数据量,默认情况下大多数浏览器允许每个原点 (origin) 存储大约 5MB 到 10MB 左右的信息。 - **SessionStorage**: 类似 LocalStorage ,但通常也有类似的上限范围即 5MB 至 10MB 不等。 #### 生命周期管理 - **Cookie** 可以设定具体的到期日期或有效期,在此之后自动删除;如果未指定则默认当次浏览结束时销毁。 - **LocalStorage** 中的数据没有明确的时间界限,除非应用程序主动调用 API 清理掉特定项或是整个数据库。 - **SessionStorage** 自动绑定至某个单独的 Tab/Window 上面,只要该实例还活着那么里面的内容就一直保留着直到退出为止。 #### 安全考量 由于 Cookies 经常携带重要凭证比如登录令牌之类的敏感资料,因此建议采取额外措施保护它们免受攻击威胁,例如启用 HttpOnly 属性防止 JavaScript 访问、Secure 标志确保只通过 HTTPS 进行通信等等^。 相比之下,虽然 LocalStorage SessionStorage 并不适合用来储存机密级别的东西,但在某些场合仍然能够发挥积极作用——前提是开发者清楚认识到其局限性并且合理规避风险因素。 ```javascript // 设置 localStorage 示例 localStorage.setItem('username', 'JohnDoe'); // 获取 localStorage 值 const username = localStorage.getItem('username'); console.log(username); // 输出 JohnDoe // 删除单个项目 localStorage.removeItem('username'); // 清除全部数据 localStorage.clear(); ``` ```javascript // 设置 sessionStorage 示例 sessionStorage.setItem('pageViewCount', 1); let count = parseInt(sessionStorage.getItem('pageViewCount')) || 0; count += 1; sessionStorage.setItem('pageViewCount', count.toString()); console.log(`Page has been viewed ${count} times.`); ``` ```javascript // 创建带选项 cookies 示例 document.cookie = "name=John Doe; expires=Thu, 18 Dec 2023 12:00:00 UTC"; ``` ### 总结对比表 | 特性 | Cookie | LocalStorage | SessionStorage | |-----------------|----------------------------------|------------------------------|-----------------------------| | **持久性** | 可配置 | 长期 | 当前会话 | | **安全性** | 较高 | 低 | 低 | | **适用范围** | 跨域请求 | 同源策略 | 同源同窗 | | **最大体积** | ~4 KB per domain | ~5 MB - 10 MB per origin | ~5 MB - 10 MB per window | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值