笔记整理:Cookie、Session、Token

Http

词条解释:Hyper Text Transfer Protocol

超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII形式给出,而消息内容类似MIME的格式。


工作原理:HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程 。

(1)客户与服务器建立连接;  
(2)客户向服务器提出请求;  
(3)服务器接受请求,并根据请求返回相应的文件作为应答;  
(4)客户与服务器关闭连接。

说明:

  • 客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。
    (服务器不会让一个连接一直处于等待状态,会及时释放从而提高服务器执行效率)
  • HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。 (减轻服务器记忆负担,保持较高的响应速度)
  • HTTP是一种面向对象的协议。允许传送任意类型的数据对象 。( 通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送
  • HTTP规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。

Cookie

百度百科词条解释:

网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常需要加密),由用户客户端计算机暂时或永久保存的信息。

Cookie出现的背景:

HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。当前对话完成后下一次对话并不会知道当前对话究竟做了什么事情。随着网络的发展以及电商的崛起,很多操作需要记住用户的身份后才能执行接下来的一系列动作。服务器自己不去记,就需要借助外部。服务器即产生了Cookie。

Cookie产生的过程:

浏览器首次访问服务器时,为了标识它自己的身份,会创建一个属于自己的key-value数据,放在Set-Cookie中,随着报文发送给浏览器。
浏览器看到有Set-Cookie信息就知道这是服务器给的标识信息,于是会将标识信息保存起来,下次请求时会自动将此标识信息放到Cookie中发送给服务器。
服务器收到请求报文后,发现Cookie中已经存储了信息,就能根据已经存在的Cookie中的信息继续后续的服务操作。


☆ Cookie就是服务器委托浏览器存储在客户端里的一些数据,而这些数据通常都会记录用户的关键识别信息。
☆ Cookie是存储在客户端方

Cookie中的参数设置:

  • 参数名作用后盾设置方法Max-Age设置cookie的过期时间,单位为秒

  • Domain指定了Cookie所属的域名cookie.setDomain("")
    设置了值之后,表示只有访问该域名时才会产生、携带cookie信息。

  • Path指定了Cookie所属的路径cookie.setPath("")
    :设置了值之后,表示只有访问该路径时才会产生、携带cookie信息。
    HttpOnly告诉浏览器此Cookie只能靠浏览器Http协议传输,禁止其他方式访问cookie.setHttpOnly(true)

  • Secure告诉浏览器此Cookie只能在Https安全协议中传输,如果是Http则禁止传输cookie.setSecure(true)

Session

词条解释:

Session被称为“会话控制”,session对象存储特定用户会话所需的属性及配置信息。(这样,当用户在web页面之间跳转时,存储在session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。)

工作原理:

当一个session第一次被启用时,一个独一的标识sessionId被存储于本地的cookie中。
同时服务端将Session会话信息保存到服务端。 浏览器第一次请求网站时,sessionId会通过Set-Cookie返回给浏览器。
浏览器收到sessionid,在下一次请求时会带上sessionId
服务端收到sessionid,就会从存储在服务端的session信息中根据sessionid匹配。匹配到后然后建立会话。
此后的请求都会交换这个sessionId,从而实现有状态的http 会话请求。

Session什么时候过期:

客户端:和Cookie过期一致,如果没有设置,默认是关了浏览器就没有了,即再打开浏览器的时候初次请求也是没有sessionId的。
服务端:服务端的过期是真的过期,服务端存储的session信息有默认的失效时间,默认30分钟。


☆ 创建出来的session会被保存到CurrentHashMap中。
☆ Session是存储在服务器中,如果后端服务器是多台的话,多服务器间的session是无法共享的。(Spring 提供了分布式Session的解决方案,将session放在Redis中)
☆ Session是存储在服务端方,客户端只存储对应的sessionId

Token

词条解释:

Token是服务器端生成的一段字符串,用来做客户端请求的一个令牌,第一次登陆后,服务器生成一个Token便将此Token返回给客户端,以后客户端只要带上这个Token前来请求数据即可,无需再次带上用户和密码信息。因此,使用Token的目的是为了减轻服务器的压力,减少频繁的查询数据库。

引入背景:

客户端频繁向服务器请求数据,服务器频繁的去数据库查询用户和密码进行比对,校验用户信息。这种操作大大降低了响应效率,降低了客户端使用体验。
session
是将要验证的信息存储在服务器,以sessionId和数据进行对应,由客户端存储,请求时会将sessionId携带,返回给浏览器,实现了状态的对应;Token是在服务端将用户信息经过(Base64Url)编码后传给客户端,每次客户端请求都会带上这一段信息,而服务器拿到这段信息再根据相应的方式再解密就能知道用户信息了。这个方法称为JWT(Json
Web Token)

Token的优点:

  • 对比session而言, 当后端系统有多台时,由于是客户端访问时直接带着数据,因此无需做共享数据的操作。

  • 简洁:可以通过URL,POST参数或者是在HTTP头参数发送,因为数据量小,传输速度也很快

  • 自包含:由于串包含了用户所需要的信息,避免了多次查询数据库

  • 因为Token是以Json的形式保存在客户端的,所以JWT是跨语言的
    不需要在服务端保存会话信息,特别适用于分布式微服务

    ☆ 总结 ☆
    Cookie是存储在客户端的 ;Session是存储在服务端的;Token是一个令牌,无状态。
    Seesion可以理解为一个状态列表,拥有一个唯一会话标识(sessionId,存储在客户端Cookie中,随请求携带),可以根据sessionId匹配到存储在服务器中的session信息。
    Token无状态,将服务器需要的信息经过Base64编码后放到Token中,每次客户端请求会携带,服务器可直接解码拿到Token中的存储的信息。

你可能感兴趣的:(历史博客,http,java,服务器)