参考:https://www.kancloud.cn/kancloud/tealeaf-http/43837
目标:理解http协议和web应用,基于python搭建服务器
一、引入:
浏览器充当一个客户端与服务器交互的接口
包括CSS、HTML、Javascript、视频图片等,都是通过传输协议如http从服务器传输到客户端,从而在浏览器中显示
HTTP,即超文本传输协议,用以连接应用程序和超文本文档的传输,定义了一种规则,规定请求和响应的消息格式
互联网,网络连接设备,互联网协议(即IP协议)标志每一个设备或服务器,端口区分交互目标
域名解析系统(即DNS)处理URL和IP之间的对应关系,它是一个分布式的数据库
交互过程:输入网址 -> 网络接口 -> DNS解析 -> 服务器接收请求 -> 服务器响应 -> 浏览器呈现结果
二、URL(Uniform Resource Locator)统一资源定位符
[Scheme]://[host:port][path][?query]
Scheme:URL模式,定义web客户端访问资源的方式
host:资源路径或主机,描述资源的确切位置
port:监听请求的端口号,默认端口是80
path:URL路径,定义客户端请求服务器的什么资源
query:查询字符串,格式为key=value,用&连接
URL编码:默认只接受ASCII码,%转义,/?:&保留字
三、准备工作:
浏览器插件:Chrome Postman、REST HTTP API Client
HTTP GUI:PAW、HTTP Client、Fiddler、Cocoa Rest Client
HTTP命令行:Curl
四、HTTP之发起请求
浏览器:在地址栏输入网址,浏览器处理响应并进行展示
HTTP工具:返回原始相应数据
审查器(Inspector):查看HTTP请求和响应
发起请求:curl -X GET "http://www.reddit.com/" -m 30 -v
Method:HTTP请求方法,最常见的为GET和POST
Status:请求的响应状态码
GET请求:超链接或浏览器地址栏访问,用于取得资源
POST请求:提交表单,更大或敏感数据
HTTP头部:允许C/S在请求/响应的HTTP周期内发送额外信息
请求头部:
Host:服务器域名
Accept-Language:可接受的语言
User-Agent:标志客户端的字符串
Connection:连接类型
五、HTTP之处理响应
状态码:服务器接收请求后返回的标志
200 OK:请求正在被处理
302 Found:资源重定向到另一个URL
404 Not Found:资源无法找到
500 Internal Server Error:服务器出错
响应头部:
Content-Encoding:数据编码类型
Server:服务器名称
Location:重定向地址
Content-Type:响应数据类型
六、WEB应用状态
HTTP协议是无状态的,即服务器不保留客户端信息,每次请求都是全新的
WEB应用是有状态的,客户端会维持用户登录状态等
会话session:在客户端和服务器之间建立一个有状态的连接
会话标志符:token,即一串数
在客户端保持无状态等HTTP协议,服务器响应数据分配token,客户端发送请求携带token
必须检查每个请求是否包含token,检查会话id确保未过期,基于会话id取出数据并处理响应
Cookies:一个请求/响应周期内,服务器发送,存储在客户端的一段数据,包含会话信息
首次访问,request没有cookie,response会通过set-cookie添加cookie数据
AJAX(异步Javascript和XML):允许浏览器发送请求/处理响应时不用刷新整个页面
每个操作都会触发一个AJAX请求,通过回调来处理请求的响应
七、安全性
安全的HTTP(HTTPS):请求和响应在发送前都会被加密(TLS协议)
加密协议首先使用证书与远程服务器通信交换安全密钥
同源策略(Same-origin policy):允许来自同一站点的资源互相访问
同源要求相同的协议、主机名和端口号
同源策略限制访问的是文件内容即资源,而非链接如URL
跨域资源共享(CORS):与许绕过同源策略,请求另一个域名的资源
添加新的HTTP头部,对一些域名的资源访问进行授权
会话劫持(Session Hijacking):攻击者获取用户的会话id
重置会话:验证旧的会话id并生成一个新的会话id
设置会话的过期时间
整站使用HTTPS协议
跨站脚本攻击(XSS):不处理用户输入,导致HTML和Javascript注入到网页中被执行
消除有问题的输入,或使用更安全的输入格式
对用户输入数据进行转义