Android网络请求知识(三)授权,TCP/IP,HTTPS建立过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络请求知识(三)授权,TCP/IP,HTTPS建立过程相关的知识,希望对你有一定的参考价值。
参考技术A由身份或持有的令牌确认享有的权限,登录过程实质上的目的也是为了确认权限。
Cookie是客户端给服务器用的,setCookie是服务器给客户端用的。cookie由服务器处理,客户端负责存储
客户端发送cookie:账户和密码
服务端收到后确认登录setCookie:sessionID=1,记下sessionID
客户端收到sessionID后记录,以后请求服务端带上对比记录下sessionID,说明已经登录
会话管理:登录状态,购物车
个性化:用户偏好,主题
Tracking:分析用户行为
XXS:跨脚本攻击,及使用javascript拿到浏览器的cookie之后,发送到自己的网站,以这种方式来盗用用户Cookie。Server在发送Cookie时,敏感的Cookie加上HttpOnly,这样Cookie只能用于http请求,不能被JavaScript调用
XSRF:跨站请求伪造。Referer 从哪个网站跳转过来
两种方式:Basic和Bearer
首先第三方网站向授权网站申请第三方授权合作,拿到授权方颁发的client_id和client_secret(一般都是appid+appkey的方式)。
在这就过程中申请的client_secret是服务器持有的,安全起见不能给客户端,用服务端去和授权方获取用户信息,再传给客户端,包括④,⑤的请求过程也是需要加密的。这才是标准的授权过程。
有了access_token之后,就可以向授权方发送请求来获取用户信息
步骤分析就是上面的内容,这里把第4,6,8请求的参数分析一下
第④步参数:
response_type:指授权类型,必选,这里填固定值‘code’
client_id:指客户端id,必选,这里填在平台报备时获取的appid
redirect_uri:指重定向URI,可选
scope:指申请的权限范围,可选
state:指客户端当前状态,可选,若填了,则认证服务器会原样返回该值
第⑥步参数:
grant_type:指使用哪种授权模式,必选,这里填固定值‘authorization_code’
code:指从第⑤步获取的code,必选
redirect_uri:指重定向URI,必选,这个值需要和第④步中的redirect_uri保持一致
client_id:指客户端id,必选,这里填在平台报备时获取的appid
client_secret:指客户端密钥,必选,这里填在平台报备时获取的appkey
第⑧步参数:
access_token:指访问令牌,必选,这里填第⑦步获取的access_token
token_type:指令牌类型,必选,大小写不敏感,bearer类型 / mac类型
expires_in:指过期时间,单位秒,当其他地方已设置过期时间,此处可省略该参数
refresh_token:指更新令牌,可选,用即将过期token换取新token
scope:指权限范围,可选,第④步中若已申请过某权限,此处可省略该参数
我们在上面的第八步中会有refresh_token的参数,这个在实际操作中也比较常见
有时候我们在自己的项目中,将登陆和授权设计成类似OAuth2的过程,不过去掉Authorization code。登陆成功返回access_token,然后客户端再请求时,带上access_token。
我们常常会说到TCP/IP,那到底是什么呢。这就需要讲到网络分层模型。TCP在传输层,IP在网络层。那为什么需要分层?因为网络不稳定,导致需要重传的问题。为了提高传输效率我们就需要分块,在传输层中就会进行分块。TCP还有两个重要的内容就是三次握手,四次分手。
HTTPS 协议是由 HTTP 加上TLS/SSL协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护
1.客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件列表(所使用的加密算法及密钥长度),客户端随机数,hash算法。
2.服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件,服务端随机数。服务器的加密组件内容是从接收到客户端加密组件内筛选出来的。
3.之后服务器发送Certificate报文。报文中包含公开密钥证书。一般实际有三层证书嵌套,其实像下面图二直接用根证书机构签名也是可以的,但是一般根证书机构比较忙,需要类似中介的证书机构来帮助。
4.最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
5.SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
6.接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
7.客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密报文作为判定标准。
8.服务器同样发送Change Cipher Spec报文。
9.服务器同样发送Finished报文。
10.服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP响应。
11.应用层协议通信,即发送HTTP响应。
12.最后由客户端断开连接。断开连接时,发送close_notify报文。这步之后再发送TCP FIN报文来关闭与TCP的通信。
利用客户端随机数,服务端随机数,per-master secret随机数生成master secret,再生成客户端加密密钥,服务端加密密钥,客户端MAC secert,服务端MAC secert。MAC secert用于做报文摘要,这样能够查知报文是否遭到篡改,从而保护报文的完整性。
android网络请求知识(一)HTTP基础概念
Android网络请求知识(二)对称和非对称加密、数字签名,Hash,Base64编码
Android网络请求知识(三)授权,TCP/IP,HTTPS建立过程
计算机网络知识总结
TCP/IP
TCP/IP模型
TCP/IP不是一个协议,而是一个协议族模型,里面包括4个层:应用层,传输层,网络层与数据层(被视为OSI七层模型的简化版)
HTTP,TCP,IP在网络中分属不同的层。
应用层:HTTP,FTP,POP,SMTP等就属于这个层。应用层主要主要向用户提供一组应用程序,比如邮件发送,远程登录等
- DNS(域名系统)是一个将域名和IP地址相互映射的分布式数据库,它可以使人更方便的访问互联网(使用域名),而不用记住IP数串。
- HTTP(超文本传输协议)是互联网上应用最广泛的协议,所有万维网的文件必须遵守该协议。设计HTTP最初的目的是为了传输和接收HTML页面。
传输层:TCP和UDP属于这个层,该层用于提供两个节点间的数据传输。
- TCP:
- 面向连接(需要手动建立连接,确保连接通畅才会传输,网络设备会预留资源以确保连接通畅,通信完成后释放连接)
- TCP连接只能有两个端点,因此TCP连接只能一对一。
- TCP提供可靠传输:不重复,不丢失,无错序。(面向连接协议中发送端和接收端都会记录发送和接收的状态)
- UDP:
- 无连接(不需要事先建立连接,接收方也不会确认,无法提供可靠传输)
- UDP没有阻塞控制,因此网络尽管出现阻塞也不会降低传输速率。
- UDP支持一对多,多对多,一对一,多对一的传输。
- UDP提供最大努力传输:不保证数据可以成功传送(无连接的数据包每次发送的状态彼此之间独立,不记录)
无连接的优点:速度快(没有阻塞控制,也省了许多保证可靠传输的机制);可以实现多对一,一对多,多对多(面向连接的需要多个独立连接才能做到);且无连接是实现面向连接的基础(IP是无连接的,它是构建TCP/IP的基础)
网络层:IP属于这个层。网络层包括地址管理与路由选择,它决定数据通过什么路径来到达另一端。在这层数据被称为数据包。
网络接口层:通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
TCP三次握手与四次握手
三次握手目的是建立可靠的连接。这三次是确认双方都能正确发送并接收对方信息的最小次数。
第一次握手:客户端发送带有SYN标志的数据包到服务端,服务端可以由此确认自己正常接收了数据,也可以确认客户端正确发送了数据。但客户端无法确认任何事。
第二次握手,服务端发送带有SYN/ACK标志的数据包到客户端,证明了自己发送数据功能正常。客户端知道了自己接收发送功能都正常,也知道了服务端接收发送都正常,但服务端不知道客户端的接收功能是否正常,也不知道自己的发送功能是否正常。
第三次握手,客户端发送带有ACK标志给服务端,至此双方都确认了自己和对方接收、发送功能正常,连接正式建立。
SYN是客户端到服务端的确认标志;而ACK是反过来的确认标志。在TCP连接中,两者互相发送信息必须都无误才行。
之所以是三次握手而不是两次握手,主要原因是:如果客户端之前发了一个SYN,但是滞留在网络中没有传到服务端。如果只有两次握手,那么服务端之后如果收到这个过时请求不会再向客户端确认,而是直接建立连接,那么会白白浪费资源。
断开一个TCP连接需要四次挥手:
第一次挥手:客户端发送带FIN标志的数据包给服务端,告诉服务端客户端已停止传送数据。
第二次挥手:服务端发回客户端ACK,并进入CLOSE_WAIT状态,表示知道了。此时从客户端到服务端的传输通道关闭。(但反向通道没有关闭,于是此时连接处于半关闭状态)
第三次挥手:等到服务端的数据发送完毕后,它会再给客户端发一个FIN。
第四次挥手:客户端收到后返给服务端ACK,服务端收到后正式关闭通道。而客户端需要等待一段时间后再进入CLOSE状态。
之所以服务端不能在接收到ACK后立刻返回FIN,是因为终止数据传输的指令是上层应用层下达的,客户端只能终结自己这边的传输通道,而服务端的数据可能还没有传完。
最后,当客户端最终发给服务端ACK之后并不是马上CLOSE,而是等一段时间(通常是报文最大寿命时间),有两个原因:
- 第一,因为它需要确认服务端收到了ACK之后才会正式关闭。如果服务端没有收到ACK的话会重新发送给客户端FIN,然后客户端会再发一次ACK,并重新计时。
- 第二,它可以消灭所有残留的报文。这也是规避掉可能有滞留在网络的过时报文进入新的请求的情况。
TCP 如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块。
- TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
TCP 的接收端会丢弃重复的数据。 - 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制:当网络拥塞时,减少数据的发送。
- 停止等待协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传: 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
HTTP协议
基本介绍
HTTP 是一个客户端终端和服务器端请求和应答的标准,是基于TCP/IP之上的应用层协议。通过使用浏览器、网络爬虫等工具,客户端发起了一个请求到服务器上指定端口,我们称这个客户端为用户代理程序。应答的服务器上会存储一些资源,我们称这个应答服务器为源服务器。在用户代理和源服务器之间有很多中间层,比如代理服务器、网关、隧道等。
工作原理
- 客户端(通常是浏览器)通过DNS查找到域名对应的IP地址。
- 根据IP地址,HTTP客户端与Web服务器的HTTP端口(默认为80)建立一个TCP连接。
- 通过TCP连接,客户端发送一个HTTP请求报文。
- 服务器接收请求,根据提供的参数,cookies等信息再生成HTTP响应,并将资源副本(通常是HTML)写到TCP套接字,由客户端读取。
- 释放TCP连接
- 客户端浏览器解析HTML内容。
例如:在浏览器地址栏输入一个url,回车后所经历的流程如下:
- 浏览器向DNS服务器请求解析该url中对应的IP地址。
- 解析到IP地址后,根据IP地址和端口号,和对应服务器建立TCP连接。
- 浏览器发出读取文件(URL中域名后面部分)的HTTP请求。该请求报文作为TCP三次握手的第三个报文的数据发送给服务器。
- 服务器对浏览器请求做出响应,并把对应的html文本发送给浏览器。
- 释放TCP连接
- 浏览器解析并显示html内容。
HTTP特性
- 基于请求-响应模式
HTTP协议规定,请求由客户端发出,然后服务器端进行响应。如果客户端没有请求,服务器端也不会响应。 - 无状态
HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说,如果该事务后续处理要求前边的信息,则必须要重新传输。这样的好处时当每个事务是独立的时,它的响应速度会很快,但也意味着如果事务间有联系的话则需要传入重复的数据。对此引入cookies技术,该技术可以保持一个状态(比如用户登录了网站,但是他跳转的同时需要保持登录状态)。 - 无连接
无连接意味着服务器一次链接处理一个请求,当完成响应并且得到客户端应答后即断开。采用这种方式可以节省传输时间,并且提高并发性能。
请求方法
HTTP定义了八种方法来操作指定的资源:
- GET:请求指定的资源,并返回实体本体。
- HEAD:也是请求指定资源,但不会返回具体内容,用于获取报头。
- POST:向指定资源提交数据。(这个请求可能会导致新资源的创建或者旧资源的修改)
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除指定的数据。
- TRACE:回显服务请求,用于测试诊断。
- OPTION: 这个方法可使服务器传回该资源所支持的所有HTTP请求方法,允许客户端查看服务器是否正常运行。
- HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
HTTP 状态码
1xxx(信息):请求已服务器接收,继续处理。
2xxx(成功):请求已被服务器成功接收,理解。
3xxx(重定向):需要后续操作。
4xxx(客户端错误):请求无法实现。
5xxx(服务器错误):服务器在实现某个正常请求时出现问题
常见状态码:
200 OK: 请求成功
301 Moved permanently:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
400 Bad request:请求有语法错误,服务器无法理解
402 Unauthorized:请求要求用户的身份认证
403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found:服务器无法根据客户端的请求找到资源(网页)。
500 Internal Server Error:服务器内部错误,无法完成请求
URL
URL,全称是Uniform Resource Locator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
以下是一个url应有的格式:
http://www.mmm.com:80/max?name=max&age=26#first
- http表示协议;
- www.mmm.com表示域名部分(也可以直接使用IP地址)
- :80是一个端口部分,如果省略的话则使用默认端口。
- /max表示虚拟路径部分,从第一个/开始到?为止,包括目录与文件名。
- ?开始之后表示参数部分,有两种方法设置参数:
- 以?开始,以&进行参数分割,以=匹配键和值:
http://120.0.0.1:8000/admin?name=max&age=30 - 用分隔符来分
http://120.0.0.1:8000/admin/max/30 #(感觉容易和路径混淆。)
- 以?开始,以&进行参数分割,以=匹配键和值:
-
到最后是锚部分(不是必须的)
HTTP与HTTPS的区别
HTTP以明文形式在浏览器和服务器之间传递信息,不提供加密。如果攻击者截取了报文,则可以直接窃取信息。
HTTPS则在HTTP的基础上添加了SSL加密协议。SSL依靠证书来验证服务器的身份,并且为客户端与服务端的通信提供加密。HTTPS协议更安全,但是在握手时也更耗时。
RESTful
什么是REST?
Representation State Transfer:表现层状态转化。
表现层意思是“资源的表现方法”,比如文本的表现方法是txt文件,图片的表现方法是jpg等。而状态转化的意思是“通过某种手段让服务器发生变化”。这种手段就是HTTP协议操作。综上所述,REST的意思是:
- Resources:使用URL定位资源。
- Representation:在客户端与服务端,传递资源的表现层
- State Transfer:使用4个HTTP动词(GET,POST,PUT,DELETE)对服务器进行操作。
REST是网络中client与server之间的交互风格,REST本身不实用,实用的是如何写出RESTful的API。
- URI使用名词而不是动词,且名词最好是复数。
- 具体动词使用HTTP的操作符GET,POST等
- 使用HTTP status code 来传递状态信息,比如404什么的。
- 传递资源的某种表现形式(比如json,html,jpg等)
以上是关于Android网络请求知识(三)授权,TCP/IP,HTTPS建立过程的主要内容,如果未能解决你的问题,请参考以下文章