本文的组织脉络如下 Cookie 和 SessionHTTP 协议是一种 Session 是什么客户端请求服务端,服务端会为这次请求开辟一块 Session 如何判断是否是同一会话服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客户端发送要求设置 Cookie 的响应;客户端收到响应后,在本机客户端设置了一个 JSESSIONID=XXXXXXX 的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束。 接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie 信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。 Session 的缺点Session 机制有个缺点,比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。 Cookies 是什么HTTP 协议中的 Cookie 包括
Cookie 主要用于下面三个目的
登陆、购物车、游戏得分或者服务器应该记住的其他内容
用户偏好、主题或者其他设置
记录和分析用户行为 Cookie 曾经用于一般的客户端存储。虽然这是合法的,因为它们是在客户端上存储数据的唯一方法,但如今建议使用现代存储 API。Cookie 随每个请求一起发送,因此它们可能会降低性能(尤其是对于移动数据连接而言)。 创建 Cookie当接收到客户端发出的 HTTP 请求时,服务器可以发送带有响应的 Set-Cookie 和 Cookie 标头
此标头告诉客户端存储 Cookie 现在,随着对服务器的每个新请求,浏览器将使用 Cookie 头将所有以前存储的 Cookie 发送回服务器。 有两种类型的 Cookies,一种是 Session Cookies,一种是 Persistent Cookies,如果 Cookie 不包含到期日期,则将其视为会话 Cookie。会话 Cookie 存储在内存中,永远不会写入磁盘,当浏览器关闭时,此后 Cookie 将永久丢失。如果 Cookie 包含 还有一种是 会话 Cookies上面的示例创建的是会话 Cookie ,会话 Cookie 有个特征,客户端关闭时 Cookie 会删除,因为它没有指定 但是,Web 浏览器可能会使用会话还原,这会使大多数会话 Cookie 保持永久状态,就像从未关闭过浏览器一样。 永久性 Cookies永久性 Cookie 不会在客户端关闭时过期,而是在 Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Cookie的 Secure 和 HttpOnly 标记安全的 Cookie 需要经过 HTTPS 协议通过加密的方式发送到服务器。即使是安全的,也不应该将敏感信息存储在cookie 中,因为它们本质上是不安全的,并且此标志不能提供真正的保护。 HttpOnly 的作用
Cookie 的作用域
例如,如果设置 例如,设置
JSON Web Token 和 Session Cookies 的对比
下面是 JWT 和 Session 不同之处的研究 JWT 和 Session Cookies 的相同之处在探讨 JWT 和 Session Cookies 之前,有必要需要先去理解一下它们的相同之处。 它们既可以对用户进行身份验证,也可以用来在用户单击进入不同页面时以及登陆网站或应用程序后进行身份验证。 如果没有这两者,那你可能需要在每个页面切换时都需要进行登录了。因为 HTTP 是一个无状态的协议。这也就意味着当你访问某个网页,然后单击同一站点上的另一个页面时,服务器的 因此,如果你登录并访问了你有权访问的另一个页面,由于 HTTP 不会记录你刚刚登录的信息,因此你将再次登录。 JWT 和 Session Cookies 就是用来处理在不同页面之间切换,保存用户登录信息的机制。 也就是说,这两种技术都是用来保存你的登录状态,能够让你在浏览任意受密码保护的网站。通过在每次产生新的请求时对用户数据进行身份验证来解决此问题。 所以 JWT 和 Session Cookies 的相同之处是什么?那就是它们能够支持你在发送不同请求之间,记录并验证你的登录状态的一种机制。 什么是 Session CookiesSession Cookies 也称为 在每次请求时,服务器都会从会话 Cookie 中读取 SessionId,如果服务端的数据和读取的 SessionId 相同,那么服务器就会发送响应给浏览器,允许用户登录。 什么是 Json Web TokensJson Web Token 的简称就是 JWT,通常可以称为 使用 JWT 主要用来下面两点
JWT 的格式下面,我们会探讨一下 JWT 的组成和格式是什么 JWT 主要由三部分组成,每个部分用
因此,一个非常简单的 JWT 组成会是下面这样 然后我们分别对不同的部分进行探讨。 Header Header 是 JWT 的标头,它通常由两部分组成: 例如
指定类型和签名算法后,Json 块被 Payload Token 的第二部分是
例如 { 然后 payload Json 块会被 signature JWT 的第三部分是一个签证信息,这个签证信息由三部分组成
比如我们需要 HMAC SHA256 算法进行签名
签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证 JWT 的发送者的真实身份 拼凑在一起现在我们把上面的三个由点分隔的 Base64-URL 字符串部分组成在一起,这个字符串可以在 HTML 和 HTTP 环境中轻松传递这些字符串。 下面是一个完整的 JWT 示例,它对 header 和 payload 进行编码,然后使用 signature 进行签名 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ 如果想自己测试编写的话,可以访问 JWT 官网 https:///#debugger-io JWT 和 Session Cookies 的不同JWT 和 Session Cookies 都提供安全的用户身份验证,但是它们有以下几点不同 密码签名JWT 具有加密签名,而 Session Cookies 则没有。 JSON 是无状态的JWT 是 身份验证可以在 可扩展性Session Cookies 是存储在服务器内存中,这就意味着如果网站或者应用很大的情况下会耗费大量的资源。由于 JWT 是无状态的,在许多情况下,它们可以节省服务器资源。因此 JWT 要比 Session Cookies 具有更强的 JWT 支持跨域认证Session Cookies 只能用在 使用 JWT 可以解决这个问题,使用 JWT 能够通过 JWT 和 Session Cookies 的选型我们上面探讨了 JWT 和 Cookies 的不同点,相信你也会对选型有了更深的认识,大致来说 对于只需要登录用户并访问存储在站点数据库中的一些信息的中小型网站来说,Session Cookies 通常就能满足。 如果你有企业级站点,应用程序或附近的站点,并且需要处理大量的请求,尤其是第三方或很多第三方(包括位于不同域的API),则 JWT 显然更适合。 后记前两天面试的时候问到了这个题,所以写篇文章总结一下,还问到了一个面试题,禁用 Cookies,如何使用 Session ?网上百度了一下,发现这是 PHP 的面试题,em..... 但还是选择了解了一下,如何禁用 Cookies 后,使用 Session
相关参考: https://www.cnblogs.com/Renyi-Fan/p/11012086.html https://blog.csdn.net/qq_28296925/article/details/80921585 https://www.cnblogs.com/-ROCKS/p/6108556.html https://www./manage-cookies/ https://www.jianshu.com/p/4a124a10fcaf https://tools./html/rfc7519 https:///introduction/ https:///blog/browser-cache-vs-cookies-difference/ https:///blog/difference-json-web-tokens-vs-session-cookies/ |
|