1. HTTP是什么
1.1 HTTP定义
http是超文本传输协议,基于TCP/IP网络传输,是一种应用层协议,能保证传输过程可靠、有序、完整,是互联网的基础。
1.2 HTTP网络层次
HTTP位于TCP的上层,使用TCP进行报文传输,TCP位于IP的上层,使用IP进行寻址和路由。
TCP提供了
- 无差错的数据传输
- 有序传输
- 未分段的数据流
1.3 完整的浏览器和服务器通信过程
- 服务器准备工作
a. 创建socket连接(new)
b.将端口如80绑定到该连接(bind)
c.启动监听(listen)
d.等待连接(accept) -
浏览器请求服务
image.png
1.4 HTTP组成
从资源、事务、报文三部分来讲解,资源对应去哪里取(where),事务对应怎么取(how),报文对应传输什么(what)。
1.4.1 资源
- 媒体类型
MIME类型用来标识数据的类型,由主类型/子类型结构组成,语法为type/subtype,用来表明数据的处理方式。
常见的媒体类型为
文件后缀 | MIME类型 |
---|---|
.json | application/json |
.js | text/javascript |
.htm .html | text/html |
着重讲解multipart/form-data
multipart/form-data
用于从浏览器发送信息给服务器,是一种复合形式
如表单
<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
<input type="text" name="myTextField">
<input type="checkbox" name="myCheckBox">Check</input>
<input type="file" name="myFile">
<button>Send the file</button>
</form>
发送的请求如下
POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"
Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"
on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain
Simple file.
-----------------------------8721656041911415653955004498--
参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
- URI/URL
URI是统一资源标识符,URL是统一资源定位符号,URL是URI最常见的一种标识符类型。
URL定义了协议、服务器、本地资源
1.4.2 事务
- 方法
HTTP 定义了一组请求方法, 以表明要对给定资源执行的操作
GET
GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
HEAD
HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
POST
POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT
PUT方法用请求有效载荷替换目标资源的所有当前表示。
DELETE
DELETE方法删除指定的资源。
CONNECT
CONNECT方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS
OPTIONS方法用于描述目标资源的通信选项。
TRACE
TRACE方法沿着到目标资源的路径执行一个消息环回测试。
PATCH
PATCH方法用于对资源应用部分修改。
- 状态码
HTTP 响应状态代码指示特定HTTP请求是否已成功完成。
响应分为五类:
1.信息响应(100–199)
2.成功响应(200–299)
3.重定向(300–399)
4.客户端错误(400–499)
5.服务器错误 (500–599)
1.4.3 报文
image.png1.5 HTTP客户端识别
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
Cookie 主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
Cookie 的生命周期
两种方式定义:
- 会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(
Expires
)或者有效期(Max-Age
)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。 - 持久性 Cookie 的生命周期取决于过期时间(
Expires
)或有效期(Max-Age
)指定的一段时间。
限制访问 Cookie
有两种方法可以确保 Cookie
被安全发送,并且不会被意外的参与者或脚本访问:Secure
属性和HttpOnly
属性。
标记为 Secure
的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 man-in-the-middle 攻击者的攻击。但即便设置了 Secure
标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure
标记也无法提供确实的安全保障, 例如,可以访问客户端硬盘的人可以读取它。
从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用Cookie的 Secure 标记。
Cookie 的作用域
Domain 和 Path 标识定义了Cookie的作用域:即允许 Cookie 应该发送给哪些URL。
- Domain
Domain
指定了哪些主机可以接受 Cookie。如果不指定,默认为同源策略origin,不包含子域名
。如果指定了Domain
,则一般包含子域名。因此,指定Domain
比省略它的限制要少。但是,当子域需要共享有关用户的信息时,这可能会有所帮助。
例如,如果设置 Domain=mozilla.org
,则 Cookie 也包含在子域名中(如developer.mozilla.org
)。
- Path 属性
Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs,则以下地址都会匹配:
/docs
/docs/Web/
/docs/Web/HTTP - SameSite属性
SameSite
Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击CSRF。
Set-Cookie: key=value; SameSite=Strict
SameSite 可以有下面三种值:
None。浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
Strict。浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
Lax。与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接
网友评论