美文网首页
Cookie,Session,Token摘要

Cookie,Session,Token摘要

作者: 就叫basi | 来源:发表于2020-09-18 17:34 被阅读0次

    前言:
    Http是无状态的协议,每次客户端和服务端的会话都是完全独立的,服务端不会保存任何会话信息。所以服务端与客户端为了进行会话跟踪,就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器,而这个状态需要通过cookie和session来实现

    cookie

    Cookie是一段不超过4KB的小型文本数据,由一个Name、一个Value和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成

    • cookie存储在客户端
    • cookie是不可跨域的:每一个cookie都会绑定单一的域名,无法在别的域名下获取使用
    • maxAge:cookie的失效时间,整数,则该cookie在maxAge秒后失效;如果为负数,该cookie为临时cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该cookie,如果为0,表示删除该cookie
    • expires:过期时间,有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

    使用 cookie 时需要考虑的问题

    因为存储在客户端,容易被客户端篡改,使用前需要验证合法性

    不要存储敏感数据,比如用户密码,账户余额

    使用 httpOnly 在一定程度上提高安全性

    尽量减少 cookie 的体积,能存储的数据量不能超过 4kb

    设置正确的 domain 和 path,减少数据传输

    cookie 无法跨域

    一个浏览器针对一个网站最多存 20 个Cookie,浏览器一般只允许存放 300 个Cookie

    移动端对 cookie 的支持不是很好,而 session 需要基于 cookie 实现,所以移动端常用的是 token

    session

    session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中

    session 认证流程:


    使用 session 时需要考虑的问题

    将 session 存储在服务器里面,当用户同时在线量比较多时,这些 session 会占据较多的内存,需要在服务端定期的去清理过期的 session

    当网站采用「集群部署」的时候,会遇到多台 web 服务器之间如何做 session 共享的问题。因为 session 是由单个服务器创建的,但是处理用户请求的服务器不一定是那个创建 session 的服务器,那么该服务器就无法拿到之前已经放入到 session 中的登录凭证之类的信息了。

    当多个应用要共享 session 时,除了以上问题,还会遇到跨域问题,因为不同的应用可能部署的主机不一样,需要在各个应用做好 cookie 跨域的处理。

    「sessionId 是存储在 cookie 中的,假如浏览器禁止 cookie 或不支持 cookie 怎么办?」 一般会把 sessionId 跟在 url 参数后面即重写 url,所以 session 不一定非得需要靠 cookie 实现

    「移动端对 cookie 的支持不是很好,而 session 需要基于 cookie 实现,所以移动端常用的是 token」

    Cookie 和 Session 的区别

    「安全性」: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
    「存取值的类型不同」:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
    「有效期不同」:Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
    「存储大小不同」: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

    Token(令牌)

    token是访问资源接口(API)时所需要的资源凭证

    token 的身份验证流程:


    • 「每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里」
    • 「基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库」
    • 「支持移动端设备」

    使用 token 时需要考虑的问题

    如果你认为用数据库来存储 token 会导致查询时间太长,可以选择放在内存当中。比如 redis 很适合你对 token 查询的需求。

    token 完全由应用管理,所以它可以避开同源策略

    token 可以避免 CSRF 攻击(因为不需要 cookie 了)

    移动端对 cookie 的支持不是很好,而 session 需要基于 cookie 实现,所以移动端常用的是 token

    Token 和 Session 的区别

    • Session 是一种「记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息」。而 Token 是「令牌」,「访问资源接口(API)时所需要的资源凭证」。Token 「使服务端无状态化,不会存储会话信息。」
    • Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。「如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。」

    相关文章

      网友评论

          本文标题:Cookie,Session,Token摘要

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