HTTP请求常见字段cookie、session、token鉴权

news/2024/7/19 8:59:08 标签: http, 爬虫
http://www.w3.org/2000/svg" style="display: none;">

上次介绍了HTTP的原理以及HTTPS的加密过程,本章将围绕HTTP请求常见的字段cookie、session、token进行详解!

HTTP引入cookie和session的原因

我们知道,HTTP是一种无状态协议,一旦数据进行交易后,连接就会断开,这样将会导致下一次进行数据交易时,会产生一个与之前无关联的新的交易数据,就如我们网上购物,第一次将商品加入购物车A中,再次加入购物车时,就不知道是加入的购物车A还是B了。为了解决这个问题,在指定时间内能够保存一个完整的会话(理论上一个完整的会话指的是客户端与服务器的所有请求操作过程),分别从客户端和服务器两个方向分别引入了cookie和session。客户端利用cookie来保存相应的会话信息,服务器通过客户端传递的cookie来判断客户端的身份;服务器利用session来保存相应的会话信息(客户端的状态),客户端查看自身信息是否存在于服务器中

cookie的实现机制

  • cookie存储会话信息的过程:
    客户端通过浏览器发送Http请求(携带客户端的个人信息等)到服务器,服务器接收到请求后,返回响应内容,并且颁发给客户端携带客户端个人信息的set-cookie(一段小文本,通过响应头返回给客户端,不同网站颁发的cookie不一样),指示客户端建立一个cookie(保存这段文本值),在此之后,cookie失效之前,客户端每次给服务器发送请求,都会在请求头中携带该cookie值,服务器每次通过分析cookie信息,动态生成与客户端相应的内容(服务器可根据需求对cookie进行修改,网站之间不可修改cookie值)
    注:客户端若将cookie值存储在内存中,当浏览器被关闭后,cookie将会被清除,若存在硬盘中,浏览器关闭,cookie不会被清除
    https://img-blog.csdnimg.cn/c067b39fef5847609d901ae6f9aa3506.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rWB5aKo6aao,size_17,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />

  • 服务器获取客户端的cookie调用的方法:request.getCookie() 返回数组类型
    服务器设置cookie的生效时间:cookie.setMaxAge(Integer.MAX_VALUE)
    服务器获取cookie的失效时间:cookie.getMaxAge()
    服务器设置域名:cookie.setDomain(域名)
    服务器设置路径:cookie.setPath(路径)
    设置服务器只在SSL\HTTPS安全协议下传送:cookie.setSecure(true)
    服务器向客户端设置/修改cookie的方法:response.addCookie(Cookie cookie) 修改只能通过覆盖原来的cookie

  • 使用cookie需要注意:
    1、cookie中使用Unicode字符时,需要对Unicode进行编码,如使用中文;如果使用二进制,则需要使用BASE64进行编码
    2、cookie中可使用数字证书,提高安全性,但由于每次客户端请求时头部都会携带cookie,因此cookie值尽量精简
    3、修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败
    4、domain参数必须以点(".")开始

  • cookie中的属性
    Name:cookie的名称,一旦设置就不可进行更改
    Value:cookie中name对应的value值
    Domain:可访问该cookie的域名,如 .google.com,则所有以google.com结尾的域名都可访问该cookie值
    Path:cookie的使用路径,规定contextPath为特定,路径的程序才可访问,如果设置为 ‘/’ ,则代表该域名下的contextPath都可访问
    Expires / Max-Age:cookie失效的时间,单位为秒,默认值为-1,Max-Age>0时,浏览器会将该cookie值持久化,保存到相应的
      cookie文档当中去,除非到失效时间,否则浏览器或者电脑关闭,cookie值也不会失效;Max-Age<0代表cookie为临时值,cookie
      值保存到浏览器内存中,一旦浏览器关闭,cookie也会被清除;Max-Age=0代表删除该cookie值;
    Secure:Cookie是否仅被使用安全协议传输,默认值为false,安全协议一般有ssl、HTTPS
    comment:cookie的使用说明
    version:该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
    https://img-blog.csdnimg.cn/5fd3b9f41f074b20923da7bfebdf98ac.png" alt="在这里插入图片描述" />

session的实现机制

  • session存储客户信息的过程
    客户端访问服务器,服务器从session中查找相对应的客户端信息,如果没有查询到,服务器会自动创建一个与客户端信息相对应的session值,存储在内存中,并发送JSESSIONID(session的id)给客户端,之后客户端每次访问服务器都会携带JSESSIONID,服务器根据JSESSIONID值判断客户端的状态,再将相对应的客户端信息返回给服务器,并更新session的最后访问时间

  • 服务器获取session值的方法:request.getSession() 如果不存在session,返回null
    服务器获取session值的方法:getSession() 如果不存在session,则创建一个session,并返回该session
    读客户端的状态:session.getAttribute()
    写客户端信息:session.setAttribute()
    设置session的有效时间:setMaxInactiveInterval(longinterval)
    获取session的有效时间:getMaxInactiveInterval()
    获取session的所有属性值:getAttributeNames() 返回一个枚举类型
    移出session属性:removeAttribute(attribute)
    返回session最后的活跃时间:getLastAccessedTime()
    获取session的id值:HttpSession.getId()
    判断session是否为新建的: isNew()
    URL地址重写:response.encodeURL(Stringurl)

  • 使用session需要注意:
    1、Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力
    2、只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session
    3、只要用户访问了服务器,就默认该用户在服务器存储的session活跃了一次
    4、重写后的URL后面携带 “;jsessionid=XXX”
    5、tomcat是根据请求的地址栏中是否带有cookie,从而判断浏览器是否支持存储cookie,对于第一次请求某浏览器时,是不会携带cookie值的,这样就导致第一次请求的URL中会携带jsessionid值
    6、大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session
    7、对于大多数不支持使用cookie机制的浏览器,可直接禁止Session使用Cookie作为识别标志

  • 采用URL重写功能解决客户端禁用cookie情况
    客户端将用户session的id值重写入URL中发送给服务器,服务器接收到URL后进行解析。获取到相应的JSESSIONID值进行判断,从而获取到用户的状态

token的出现

如果用户登陆了网站A,生成网站A相应的session值,再携带相关sessionId去访问伪造网站B,那么网站B就可以窃取到用户的信息,从而利用信息去访问网站A,进行一系列危害用户的操作,为了解决这个问题,token由此诞生了。

token的生效机制

客户端访问服务器,服务器会根据一定规则生成一个token值,并将token值通过cookie值存储在响应头返回给客户端,客户端存储cookie值,并在下次访问服务器时携带包含token的cookie值,服务器接收到cookie值,将cookie中的token与数据库中存在的用户信息进行匹配,匹配成功则实现自动登录,并生成新的token值封装进cookie中返回给客户端

  • token的出现可解决

1、同源策略:即A网页设置的cookie,B网页无法打开,能够使用同一cookie的网页必须是同源的,即:协议相同、域名相同、接口相同
2、CSRF攻击(Cross-site request forgery):跨站请求伪造,攻击者盗用用户的身份进行一系列危害用户信息、财产等操作
3、可在多个服务间共享

  • token失效时间的设置
    方案一:服务器存储token状态,用户每操作一次,token的失效时间就刷新一次(延迟),针对于一些前后端分离、单页APP等会引起短时间多次请求刷新,就会消耗大量资源,为了尽可能降低消耗,token的失效时间会存储在内存或者缓存中
    方案二:使用Refresh Token,可避免重复的读写操作。客户端第一次发送请求给服务器,服务器校验用户身份,创建一个相比较token有效期更长的Refresh Token并关联上token一起返回给客户端,客户端之后发送请求,服务器检查token失效时间,如果已过期,将失效token发送给客户端,客户端发送Refresh Token重新申请Token,服务器接收到Refresh Token并进行校验,校验成功,则生成一个新的token代替原来的token,并将新的token返回给客户端,客户端再次携带新的token和请求数据请求服务器

https://img-blog.csdnimg.cn/b32acca7d8124ea1aa8535654554e370.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rWB5aKo6aao,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />

UUID

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的


http://www.niftyadmin.cn/n/652905.html

相关文章

Ubuntu 18.04 LTS安装vncserver虚拟网络控制台

虚拟网络控制台&#xff08;VNC&#xff09;是一个图形桌面共享软件&#xff0c;允许您使用键盘和鼠标远程控制另一台计算机。 系统环境 服务端&#xff1a;Ubuntu 18.04 Server LTS客户端&#xff1a;Windows10客户端VNC-Viewer 6.20下载地址&#xff1a;https://www.realvnc…

实现kubernetes容器状态同步机制核心

在K8s中将Pod调度到某一台Node节点之后&#xff0c;后续的状态维护信息则是由对应机器上的kubelet进行维护&#xff0c;如何实时反馈本地运行状态&#xff0c;并通知apiserver则是设计的难点&#xff0c; 本节主要是通过感知Pod状态变化和探测状态改变两个流程来实际分析其核心…

Fiddler详解-Fiddler Classic

Fiddler和Charles一样&#xff0c;都是网络封包截取工具。可以利用Fiddler抓取web端、移动端与服务器之前的接口请求&#xff0c;测试人员可以根据请求数据快速地定位出软件出现bug的原因&#xff08;是前端处理数据不当还是后端提供的接口数据有问题&#xff09;&#xff0c;研…

分享Linux系统快速入门法

相信看到这篇文章的你一定是想要学习Linux&#xff0c;或者已经在学习Linux的人了&#xff0c;那我们就可以一起探讨一下&#xff0c;学习Linux如何快速入门呢&#xff1f; 首先&#xff0c;希望大家弄清楚自己为什么要学习Linux&#xff0c;有的人是因为兴趣&#xff0c;有的…

解决 Windows8(RP)Metro IE10 打不开 或 闪退

Windows8&#xff08;RP&#xff09;Metro IE10 闪退在 控制面板 中找到 程序和功能&#xff0c;打开 启用或关闭 Windows功能卸载 Internet Explorer 10系统重启后重装 Internet Explorer 10Internet Explorer 10重装后&#xff0c;Metro IE10 闪退问题便解决了针对网友提供的…

python—pytest入门学习

PyTest介绍&#xff1a; PyTest是一个测试用例的管理框架&#xff0c;在UnitTest基础上做的一个全面的升级。 集成度更高&#xff0c;而且更加自由的一个测试框架&#xff0c;全程都是基于指令的形式运行。 PyTest-uniTest-RobotFramework-airtestPyTest环境部署&#xff1a…

服务之间的调用 HTTP代替RPC?

RPC(Remote Procedure Call)—远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。什么是 RPC? RPC(Remote Procedure Call)—远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0…

ADB的使用-简单命令

今天记录的是 Android Debug Bridge&#xff0c;安卓debug调试桥&#xff0c;它是一款测试/开发人员必不可少的利器。作为一名测试人员&#xff0c;今天主要了解它在测试中简单的应用命令。 ADB是一个C/S架构&#xff08;默认端口号为&#xff1a;5037&#xff09;&#xff0c;…