Session、Cookie、Token(JWT)

127 阅读4分钟

image.png

首先了解http,HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录

Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。

Session 是什么

介绍

客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。

Session 如何判断是否是同一会话

服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId (该空间的标识),并且返回给客户端,并且让客户端创建一个Cookie内存来存储sessionId ,这样两端会话时只需要比较sessionId,在会话期间每次向服务器端发请求都要带上Cookie,同时也包括里面的sessionId ,直到会话结束Cookie过期销毁。

什么是 Session Cookies

当用户登录时,Session 就被服务端安全的创建。用户的登录状态会保存在服务器的内存中。在每次请求时,服务器都会从会话 Cookie 中读取 SessionId,如果服务端存储的数据和读取的 SessionId 相同,那么服务器就会发送响应给浏览器,允许用户登录。

Session的缺点

比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。

Cookies是什么 ( Cookie 随每个请求一起发送)

HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与以后的每次请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器(因为Cookie中有sessionId )

创建 Cookie

当接收到客户端发出的 HTTP 请求时,服务器可以发送带有响应的 **Set-Cookie:JSESSIONID=XXXXXXX **命令 的标头,Cookie 由浏览器存储,然后将以后的每次请求都会把 Cookie 与 HTTP 标头一同发送给服务器。

image.png

缺点

因为每次都发送,所以会降低性能

运用场景

用户保持登录状态、购物车、主体设置、记录和分析用户行为等。

Cookie存在的两种形式

会话 Cookies

会话 Cookie 有个特征,浏览器关闭时 Cookie 会删除,因为它没有指定特定日期(Expires)或 特定时间长度(Max-Age) 指令。

永久性 Cookies

永久性 Cookie 不会在浏览器关闭时过期,而是在特定日期(Expires)或特定时间长度(Max-Age)后过期。

Cookie 的 HttpOnly 标记

Cookie本质上是不安全的,不要将敏感信息存储在cookie中。

HttpOnly 的作用

Cookie 中没有设置 HttpOnly 属性为 true,可能导致 Cookie 被窃取,设置也有可能会被盗,只是更加安全

禁用了Cookie,如何使用Session(面试经典扩展)

  • 如果禁用了 Cookies,服务器仍会将 sessionId 以 cookie 的方式发送给浏览器,但是,浏览器不再保存这个cookie (即sessionId) 了。
  • 如果想要继续使用 session,需要采用 URL 重写 的方式来实现
  • www.cnblogs.com/Renyi-Fan/p…

什么是 Json Web Tokens

Json Web Token 的简称就是 JWT,通常可以称为 Json 令牌。JWT 中存储的信息是经过数字签名的,因此可以被信任和理解。

JWT 和 Session Cookies 就是用来处理在不同页面之间切换,保存用户登录信息的机制

如果你希望自己的网站和其他站点建立安全连接时。使用 JWT 可以解决这个问题,使用 JWT 能够通过多个节点进行用户认证,也就是我们常说的跨域认证。

  • 认证(Authorization):这是使用 JWT 最常见的一种情况,一旦用户登录,后面每个请求都会包含 JWT,从而允许用户访问该令牌所允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小。

  • 信息交换(Information Exchange):JWT 是能够安全传输信息的一种方式。通过使用公钥/私钥对 JWT 进行签名认证。此外,由于签名是使用 head 和 payload 计算的,因此你还可以验证内容是否遭到篡改。