当前位置: 首页 > article >正文

Linux网络 HTTP cookie 与 session

Cookie

  • 定义与功能:Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户的购物车信息等。
  • 工作方式当用户第一次访问网站时,服务器在HTTP响应报头中通过Set-Cookie字段为客户端设置Cookie,客户端在后续对该服务器的请求中,会在HTTP请求报头中以Cookie字段将Cookie的值发送给服务器。
  • 分类:会话 CookieSession Cookie:在浏览器关闭时失效;持久 CookiePersistent Cookie:带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。如果 cookie 是一个持久性的 cookie,那么它其实就是浏览器相关的,特定目录下的一个文件。但直接查看这些文件可能会看到乱码或无法读取的内容,因为 cookie 文件通常以二进制或 sqlite 格式存储。一般我们查看,直接在浏览器对应的选项中直接查看即可。

设置 cookie

HTTP 存在一个报头选项: Set-Cookie , 可以用来进行给浏览器设置 Cookie 值。在 HTTP 响应报头中添加,客户端(如浏览器)获取并自行设置并保存 Cookie。

基本格式

Set-Cookie: <name>=<value>

其中 <name> Cookie 的名称,<value> Cookie 的值。

例如:

Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC; 
path=/; domain=.example.com; secure; HttpOnly
  • expires=<date>:设置 Cookie 的过期日期/时间。如果未指定此属性,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期。有关获得UTC时间的函数如下:
string GetMonthName(int month)
    {
        vector<string> months = {"Jan", "Feb", "Mar",
                                 "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
        return months[month];
    }
    string GetWeekDayName(int day)
    {
        vector<string> weekdays = {"Sun", "Mon", "Tue",
                                   "Wed", "Thu", "Fri", "Sat"};
        return weekdays[day];
    }
    string ExpireTime(int t) // 秒级别的未来 UTC 时间
    {
        time_t timeout = time(nullptr) + t;
        // 这里不能用 localtime,因为 localtime 是默认带了时区的.
        // gmtime 获取的就是 UTC 统一时间 char timebuffer[1024];
        // 时间格式如: expires=Thu, 18 Dec 2024 12:00:00 UTC
        struct tm *tm = gmtime(&timeout);
        char timebuffer[1024];
        snprintf(timebuffer, sizeof(timebuffer),
                 "%s, %02d %s %d %02d:%02d:%02d UTC",
                 GetWeekDayName(tm->tm_wday).c_str(),
                 tm->tm_mday,
                 GetMonthName(tm->tm_mon).c_str(),
                 tm->tm_year + 1900,
                 tm->tm_hour,
                 tm->tm_min,
                 tm->tm_sec);
        return timebuffer;
    }
  • path=<some_path>:限制 Cookie 发送到服务器的哪些路径。默认为设置它的路径。
  • domain=<domain_name>:指定哪些主机可以接受该 Cookie。默认为设置它的主机。
  • secure:仅当使用 HTTPS 协议时才发送 Cookie。这有助于防止 Cookie 在不安全的 HTTP 连接中被截获。
  • HttpOnly:标记 Cookie HttpOnly,意味着该 Cookie 不能被客户端脚本(如 JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。
如果 cookie 写入的是用户的私密数据,比如,用户名密码,浏览痕迹等。其问题在于这些用户私密数据在浏览器(用户端 ) 保存,非常容易被人盗取,更重要的是,除了被盗取,还有就是用户私密数据也就泄漏了,于是就引入了session。

Session

  • 定义与功能:Session是一种服务器端的机制,用于在服务器上保存用户的会话信息,如登录状态、用户偏好等。通过Session,服务器可以在多个请求之间识别和跟踪用户。
  • 工作方式:当客户端第一次请求服务器时,服务器会创建一个Session,并生成一个唯一的Session ID,通过Set-Cookie字段将Session ID发送给客户端。客户端在后续的请求中,会将Session ID发送给服务器,服务器根据Session ID找到对应的会话信息。
  • 存储方式:Session数据通常存储在服务器的内存中,也可以存储在数据库或文件系统中。
  • 生命周期:Session的生命周期可以通过设置过期时间来控制,当用户长时间没有活动时,服务器可以自动删除会话以节省资源。
Cookie 相似,由于 Session ID 是在客户端和服务器之间传递的,因此也存在被窃取的风险。但是一般虽然 Cookie 被盗取了,但是用户只泄漏了一个 Session ID ,私密信息暂时没有被泄露的风险,Session ID 便于服务端进行客户端有效性的管理,比如异地登录。

Cookie与Session的关系

  • Cookie和Session通常是结合使用的,Cookie用于在客户端存储Session ID,以便在后续请求中发送给服务器,服务器通过Session ID找到对应的Session数据。
  • Cookie是在客户端存储的小数据块,而Session是在服务器端存储的用户会话信息。
  • Cookie可以用于存储一些简单的用户信息,如用户偏好、购物车数量等,而Session可以存储更复杂的用户状态和信息,如登录状态、用户权限等。

应用场景

  • 用户登录与认证:当用户登录成功后,服务器可以创建一个Session,并通过Cookie将Session ID发送给客户端,以便在后续请求中识别用户身份。
  • 购物车功能:服务器可以通过Session或Cookie来存储用户购物车中的商品信息,以便在用户浏览不同页面时保持购物车状态。
  • 个性化设置:服务器可以通过Cookie存储用户的个性化设置,如主题、语言等,以便在用户下次访问时提供个性化的体验。


http://www.kler.cn/a/528341.html

相关文章:

  • WebForms DataList 深入解析
  • CSS 中调整元素大小的全面指南
  • 对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角
  • 【Redis】hash 类型的介绍和常用命令
  • 【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互
  • nodejs:express + js-mdict 网页查询英汉词典
  • html的字符实体和颜色表示
  • Web3技术详解
  • Notepad++消除生成bak文件
  • ROS-IMU
  • python小知识-typing注解你的程序
  • Flutter开发环境配置
  • 【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题
  • Linux——ext2文件系统(一)
  • 使用 Redis Streams 实现高性能消息队列
  • 2025 AI行业变革:从DeepSeek V3到o3-mini的技术演进
  • 蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组
  • leetcode 2563. 统计公平数对的数目
  • x86-64数据传输指令
  • 【Pytorch和Keras】使用transformer库进行图像分类
  • Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具
  • 海外问卷调查,最常用到的渠道查有什么特殊之处
  • XML DOM - 导航节点
  • CSDN图片加载不出来问题解决
  • webrtc peerconnection_client peerconnection_server 连接失败问题解决 win10 win11
  • 使用UpdateCursor删除行