Cookie

作者: 恰皮 | 来源:发表于2017-06-21 18:26 被阅读0次

    参考链接:
    HTTP cookies 详解
    cookie/session 的机制与安全
    nodejs 操作 cookie

    1. 概述

    • 早期的 Web 应用面临的最大问题之一就是如何维持状态。简言之,服务器无法知道两个请求是否来自于同一个浏览器。

    • cookie 就是浏览器储存在用户电脑上的一小段文本文件,内容是一系列的键值对。cookie 是纯文本格式,不包含任何可执行代码。

    • 一个 web 页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,web 服务器就刻意使用这些信息来识别不同的用户。

    • cookie 是为了在无状态的 http 协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道。

    2. cookie实现机制

    Paste_Image.png
    1. 浏览器发起 http 请求
    2. 对应的服务器收到该 http 请求,并计算应当返回给浏览器的 http 响应
    3. 在响应头加入 Set-Cookie 字段,设置 cookie 的值
    4. 浏览器收到来自服务器的 http 响应
    5. 浏览器在响应头发现 Set-Cookie 字段,将该字段的值保存起来
    6. 浏览器以后的每次 http 请求都会将设置的 cookie 附加在 http 请求的 cookie 字段中
    7. 服务器收到这个 http 请求,发现请求头中有 cookie 字段,便知道之前和这个用户打过交道

    3. 创建cookie

    Set-Cookie 的格式:

    Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
    

    value: 通常是 name=value 的键值对格式,代表要储存的值
    **expires: ** 指定了 cookie 的过期时间,到了过期时间浏览器会删除该 cookie,日期格式:Wdy, DD-Mon-YYYY HH:MM:SS GMT

    cookie 的生命周期分为会话 cookie 和持久 cookie,会话 cookie(Session cookie)在会话结束(浏览器关闭时)会被删除,不指定 expires 值的默认是会话 cookie,指定了 expires 值的是持久化 cookie(Persistent Cookie),在到达失效日期时会被删除。如果将 expires 设置为一个过去的 时间,cookie 也会被立即删除。如果浏览器中 cookie 的数量达到限制,旧的cookie会被删除为新的 cookie 创建空间。

    **domain: ** 指定 cookie 将要被发送至哪个域中。domain 选项的值必须是发送 Set-Cookie 消息头的主机名的一部分。
    path: 指定了请求的资源 URL 中必须存在指定的路径时,才会发送 Cookie 消息头。
    secure: 当标记了 secure 时,如果发出的 http 请求是通过 SSL 或 HTTPS 创建时,包含 secure 选项的 cookie 才能被发送至服务器。

    4. JavaScript中的cookie

    document.cookie 可以设置或者获取 cookie,属性值和 Set-Cookie 的值格式一样

    5. HTTP-only cookie

    在 Set-Cookie 中添加 HttpOnly 标记,则通过 document.cookie 则不能再访问该cookie

    6. cookie安全隐患

    1. 用户发送 http 请求服务器验证用户身份信息
    2. 服务器验证通过设置 cookie 值
    3. 浏览器存储该 cookie,下次发送 http 请求的时候也发送该 cookie,服务器通过 cookie 字段得知之前已经授权过登录。
    • 存在的问题:Cookie 可以被篡改从而欺骗服务器

    7. cookie 防篡改机制

    在服务器中配置一个 Secret,设置 cookie 的时候根据这个 secret 设置一个签名,没有登录验证过时,要篡改 cookie 的话就不知道签名是如何设置的,因此 cookie 如果被篡改了就可以被服务器发现。
    但是由于 cookie 是明文传输的,在一次登录验证成功后浏览器收到服务器设置的 cookie,以后就可以使用这个 cookie 了,仍然存在安全问题。

    8. Session 的实现机制

    • Session 是存储在服务器端的,避免了在客户端 Cookie 中存储敏感数据。
    • Session 可以存储在 HTTP 服务器的内存中,也可以存在内存数据库(如 redis)中, 对于重量级的应用甚至可以存储在数据库中。

    实现机制:

    1. 用户发送 http 请求,提交用户信息;
    2. 服务器验证通过将用户信息存储到 redis 中,生成它在 redis 的 ID,这个 ID 就是 Session ID,使用这个 ID 可以从 redis 中取出相应的数据。
    3. 设置 cookie 为 sessionId=xxx|checksum,仍然要设置签名,发送 http 响应
    4. 用户收到 http 响应,在 cookie 中便没有敏感数据了,在此后的请求中发送该 Cookie 给服务器
      5.服务器收到 http 请求后发现 cookie 中有 SessionID,进行防篡改验证,通过验证就根据 SessionID 从 redius 中取出对应的数据。

    相关文章

      网友评论

          本文标题:Cookie

          本文链接:https://www.haomeiwen.com/subject/zkqtcxtx.html