Cookie 和 Session 的区别
原理:从”登录“过程看Jwt和Token,以及区分Cookie和Session概念
面试:
好的,面试官。 我先解释一下 Cookie,它是客户端浏览器用来保存服务端数据的一种机制。 当通过浏览器进行网页访问的时候,服务器可以把某一些状态数据以 key-value 的方式 写入到 Cookie 里面存储到客户端浏览器。 然后客户端下一次再访问服务器的时候,就可以携带这些状态数据发送到服务器端,服务端可以根据 Cookie 里面携带的内容来识别使用者。 Session 表示一个会话,它是属于服务器端的容器对象,默认情况下,针对每一个浏览器的请求。 Servlet 容器都会分配一个 Session。 Session 本质上是一个 ConcurrentHashMap,可以存储当前会话产生的一些状态数据。 我们都知道,Http 协议本身是一个无状态协议,也就是服务器并不知道客户端发送过 来的多次请求是属于同一个用户。 所以 Session 是用来弥补 Http 无状态的不足,简单来说,服务器端可以利用 session 来存储客户端在同一个会话里面的多次 请求记录。 基于服务端的 session 存储机制,再结合客户端的 Cookie 机制,就可以实现有状态的 Http 协议。
客户端第一次访问服务端的时候,服务端会针对这次请求创建一个会话,并生成一个唯一的 sessionId 来标注这个会话。 然后服务端把这个 sessionid 写入到客户端浏览器的 cookie 里面,用来实现客户端状 态的保存。 在后续的请求里面,每次都会携带 sessionid,服务器端就可以根据这个 sessionid 来 识别当前的会话状态。
所以,总的来说,Cookie 是客户端的存储机制,Session 是服务端的存储机制。 这两者结合使用来实现会话状态的存储,以上就是我对这个问题的理解。
拓展:那请你再说一下token ,cookie和session的区别
-
令牌(Token):
令牌是一种用于身份验证和授权的凭证,通常以字符串的形式存在。在客户端进行身份验证后,服务器会颁发一个令牌给客户端,用于标识和验证客户端的身份。令牌通常包含有关用户身份、权限和有效期等信息,并且被存储在客户端的内存或存储介质中。在每次请求中,客户端需要将令牌包含在请求头或请求参数中发送给服务器,以便进行身份验证和授权。 -
Cookie:
Cookie 是一种存储在客户端(通常是浏览器)上的小型文本文件。服务器可以通过 HTTP 响应中的 Set-Cookie 头将一个或多个 Cookie 发送给客户端。客户端在随后的请求中通过在请求头中包含 Cookie 来将其发送回服务器。Cookie 可以用于记录用户的会话状态、跟踪用户行为或存储用户偏好设置等。Cookie 可以设置过期时间,可以是会话性 Cookie(在关闭浏览器后失效)或持久性 Cookie(在一段时间后失效)。 -
会话(Session):
会话是服务器端用于跟踪用户状态的机制。当用户通过身份验证后,服务器会为其创建一个唯一的会话,并将会话ID发送给客户端。客户端在后续请求中通常使用 Cookie 或 URL 重写来传输会话ID。服务器使用会话ID来标识和管理用户的状态和数据,以确保用户的连续性体验。会话数据通常存储在服务器的内存或数据库中,并在一定时间内保持有效。与令牌不同,会话数据由服务器负责管理,客户端只存储会话ID。
总结:
-
令牌是一种用于身份验证和授权的字符串凭证,由客户端保存并在每次请求中发送给服务器。
-
Cookie 是一种存储在客户端上的文本文件,用于跟踪用户状态和存储用户相关信息。
-
会话是服务器端用于跟踪用户状态的机制,通过会话ID在客户端和服务器之间进行通信。
需要注意的是,在实际应用程序中,令牌、Cookie和会话经常同时使用,例如,可以使用令牌进行身份验证,确认用户的身份和权限,然后使用会话来维护用户的状态和数据,以提供更个性化的用户体验或实现特定的业务逻辑。