1.HTTP与HTTPS的区别
HHTP的URL以http://开头,HTTPS以https开头
HTTP是不安全的,HTTPS 是在HTTP基础上添加了SSL层,有身份验证及加密传输机制,是安全的。
HTTP连接方式也不同
标准端口HTTP是80,HTTPS是443
HTTPS需要CA颁发证书需要收费。
OSI模型中,HTTP工作在应用层,HTTPS的安全传输机制工作在传输层。
2.HTTP连接建立方式(即输入一个URL后发生什么)
(1)DNS域名解析,找到对应的ip主机地址
(2)发起TCP三次握手
(3)连接建立后,客户端发送HTTP请求
(4)服务器端接收HTTP请求并响应请求。
(5)若 CONNECT模式为close ,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。若CONNECT模式为keepalive,则该连接保持一段时间,期间服务器可以继续接收请求。
(6)浏览器解析HTML代码,并请求HTML代码中的资源。
(7)浏览器对页面进行渲染并呈现给用户。
3.HTTPS连接建立过程(待补充)
1)客户端发起https连接
浏览器去DNS服务器获取URL对应的ip,客户端连接上服务器的443端口,将此请求发送到服务器端,客户端同时将自己支持的加密算法带给服务器。
2)服务器端发送证书
服务器端收到加密算法和自己支持的加密算法进行对比,如果不符合,断开连接,符合服务器将SSL证书发送给客户端,证书中包含数字证书的内容:证书颁发机构、使用机构、公钥、有效期、签名算法、指纹算法、指纹
服务器端发送的信息使用私钥加密后的,公钥都可以解开,不能保证数据包不被看到,所以后面会和客户端商量选择一个对称加密(只能用私钥解开)对传输的数据进行加密。
3)客户端验证服务器端发送的证书。
①验证证书:客户端收到证书,包括发布机构是否合法、过期等
②生成随机数(对称加密的私钥),用服务器端发送的公钥加密,这个随机数就只有服务器的私钥可以解开。
③生成握手信息:用证书中的签名hash算法获取握手信息的hash值,用随机数将握手信息和握手信息的hash值加密,然后用公钥将随机数加密后,发送给服务器端,计算握手信息的hash值是为了保证传回到服务器的握手信息没有被篡改。
4)服务器端接收随机数加密的信息,用私钥解密得到随机数,验证握手信息是否被篡改。
5)客户端验证服务器端发送的握手信息,完成握手。
SSL层原理
SSL利用身份验证、数据加密、和消息完整性验证机制,为网络上的数据传输提供安全性保证。SSL支持各种应用层协议。SSL位于应用层和传输层之间,所以可以为任何基于TCP等可靠连接的应用层协议提供安全保证;
1)身份验证机制
利用数字签名来验证通信对端的身份。非对称秘钥算法可以实现数字签名。由于通过私钥加密的数据只能利用对应的公钥(好像由发送方提供)进行解密,因此根据解密是否成功可以判断发送者的身份。
2)数据传输的机密性
SSL加密通道上的数据加密使用对称密钥算法,目前主要支持的有DES,3DES、AES等。可以有效防止交互数据被破解。对称密钥算法要求解密密钥与加密密钥完全一致,因此利用对称密钥算法加密传输数据之前,需要在通信两端部署相同的密钥
3)消息完整性验证
微课避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息完整性。MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。
利用MAC算法验证消息完整性:1.发送者在密钥的参与下,利用MAC算法计算消息的MAC值,并将其加在消息之后发送给接受者。接受者利用同样的密钥和MAC算法计算该消息的MAC值,与接收到的MAC值比较。如果相同,报文不变,否则,报文在传输过程被修改,接受者丢弃该报文。利用MAC算法验证消息完整性之前,也需要在通信两端部署相同的密钥
4)利用非对称密钥算法保证密钥本身的安全
对称密钥算法和MAC算方法要求通信双方有相同的密钥,否则解密和MAC值验证将失败。因此,要建立加密通道或验证消息完整性必须现在通信双方部署一致的密钥。SSL利用非对称加密算法加密密钥的方法实现密钥交换,保证第三方无法获取该密钥。SSL客户端(如Web浏览器)利用SSL服务器(如Web服务器)的公钥加密密钥,将加密后的密钥发送给SSL服务器,只有拥有对应私钥的SSL服务器才能从密文中获取原始的密钥。
SSL通常采用RSA算法加密传输密钥
实际上,SSL客户端发送给SSL服务器的密钥不能直接用来加密数据或计算MAC值,该密钥是用来计算对称密钥和MAC密钥的信息,称为premaster secret。SSL客户端和SSL服务器利用premaster secret计算出相同的主密钥(master secret),再利用master secret生成用于对称密钥算法、MAC算法等的密钥。premaster secret是计算对称密钥、MAC算法密钥的关键。
5)利用PKI保证公钥的真实性
PKI通过数字证书来发布用户的公钥,并提供了验证公钥真实性的机制。数字证书是一个包含用户公钥及其身份信息的文件,证明了用户与公钥的关联。数字证书由权威机构CA签发,并由CA保证数字证书的真实性
SSL客户端把密钥加密传递给SSL服务器之前,SSL服务器需要将从CA获取的证书发送给SSL客户端,SSL客户端通过PKI判断该证书的真实性。如果该证书确实属于SSL服务器,则利用该证书中的公钥加密密钥,发送给SSL服务器。
验证SSL服务器/SSL客户端的身份之前,SSL服务器/SSL客户端需要将从CA获取的证书发送给对端,对端通过PKI判断该证书的真实性。如果该证书确实属于SSL服务器/SSL客户端,则对端利用该证书中的公钥验证SSL服务器/SSL客户端的身份。
4.什么是HTTP无状态协议,怎么解决HTTP无状态
无状态协议对于事务处理没有记忆能力,也就是说,当客户端一次HTTP请求完成后,客户端在发送一次HTTP请求,HTTP并不知道当前客户端是一个老客户。可以使用Cookie或者session来解决无状态的问题,cookie相当于一个通行证,第一次访问的时候给客户端发送一个cookie,当客户端再来的时候,拿着cookie,服务器就知道是老用户。
cookie和session的作用和本质区别:
Cookie和session用来实现用户状态保持。
cookie工作流程:
1.用户登录时向后端服务器发送post请求,服务器接收请求,验证请求参数无误后,处理登录业务逻辑,返回响应。此时服务器端生成对应的cookie字符串,返回给前端浏览器。2.浏览器本地保存cookie值3.登录后用户向服务器发送请求就带有本地的cookie值,发送给服务器,4.服务器接受到请求获取请求参数中有cookie,服务器把获取的cookie值跟之前服务器生成的cookie值比较,则默认同一个用户在访问服务器,从而实现用户登录状态保持
session工作流程:
客户第一次访问服务器时,服务器端创建session保存在服务器中。
浏览器刚打开时,客户端cookie没有sessionID,服务器会认为是一个新的请求并分配一个新的sessionID,因此每次打开浏览器会需要重新登录。当客户端cookie保存了sessionID,我们请求服务器时,会把sessionID一起发给服务器,服务器在内存搜索对应的sessionID,找到对应sessionID,表示我们处于登录状态,有相应权限;没有找到说明要么浏览器被关闭了,要么session超时了(没有请求服务器超过20分钟),session被服务器清除了,服务器会重新分配一个新的sessionID,需要重新登录并保存sessionID。session不会因为浏览器关闭被清除,只会因为超时删除。
每个来访者对应一个session对象,所有客户的状态信息保存在session对象中,通过getAttribute(stringKey)和setAttribute(StringKey)方法读写客户状态信息。
客户端用cookie保存了sessionID,当我们请求服务器的时候,会把这个sessionID一起发给服务器,服务器会到内存中搜索对应的sessionID,如果找到了对应的 sessionID,说明我们处于登录状态,有相应的权限;如果没有找到对应的sessionID,这说明:要么是我们把浏览器关掉了(后面会说明为什 么),要么session超时了(没有请求服务器超过20分钟),session被服务器清除了,则服务器会给你分配一个新的sessionID。你得重 新登录并把这个新的sessionID保存在cookie中。
在没有把浏览器关掉的时候(这个时候假如已经把sessionID保存在cookie中了)这个sessionID会一直保存在浏览器中,每次请求的时候都会把这个sessionID提交到服务器,所以服务器认为我们是登录的;当然,如果太长时间没有请求服务器,服务器会认为我们已经所以把浏览器关掉了,这个时候服务器会把该sessionID从内存中清除掉,这个时候如果我们再去请求服务器,sessionID已经不存在了,所以服务器并没有在内存中找到对应的 sessionID,所以会再产生一个新的sessionID,这个时候一般我们又要再登录一次。
————————————————
版权声明:本文为CSDN博主「段远山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45151795/article/details/107383421
Cookie和session比较
1)都是基于键值对的字符串
2)都是由后端服务器生成
区别
1)数据存放位置:cookie保存在客户浏览器中,session保存在服务器中
2)安全程度:本地cookie可以被拿来分析后进行cookie欺骗,session比cookie安全;
4)性能上:session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器性能,为了减轻服务器性能压力,会建议使用cookie.
4.数据存储大小不同
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session存储于服务器,没有限制
补充:服务器对每个用户生成一个session,session_id用来区分用户,在本地session_id保存在cookie中,值session_data保存在服务器中,通过key来取到value,关闭浏览器,服务器session不会消失。
5.http报文组成
(1) 请求报文
请求行:包含请求方法,URL,HTTP协议版本
请求首部字段
请求内容实体
响应报文
状态行:HTTP协议版本,状态码,状态码原因短语
响应首部字段
响应内容实体
6.常用的HTTP方法
GET、POST、PUT(传输文件)、HEAD(获得报文首部)、DELETE、OPTIONS、TRACE、CONNECT。
7. POST和GET的区别
get的参数在URL中,post在请求内容实体
因此,get在浏览器回退刷新时无害,post会重新请求或提交
get产生的URL 地址浏览器可见并且会被浏览器主动缓存,post不会。
get只能进行URL编码并且长度有限,参数暴露不安全,post支持多种编码。
get产生一个TCP数据包,post产生两个。get方法浏览器会把http header和data一起发送,服务器响应200,post方法浏览器会先发送header,服务器响应100 continue 之后浏览器再发送data,服务器响应200 ok.
8.HTTP常见状态吗
(1)开头表示请求已接收、继续处理
(2)开头表示成功接受、理解了请求
(3)开头表示重定向,完成请求必须进行更进一步的操作。
(4)客户端错误,请求有语法错误或者无法实现
(5)服务器端错误,服务器不能实现合法的请求
实例:200表示服务器成功处理了请求
302(临时移动)服务器目前从不同位置的网页响应请求,但是请求者应继续使用原有位置来进行以后的请求
304(未修改)自从上次请求后,请求的网页未修改,服务器返回此响应时,不会返回网页内容。
400(错误请求)服务器不理解请求的语法
401(未授权)请求要求身份验证
403(禁止)服务器拒绝请求,没有权限
404(未找到)服务器找不到请求的网页
500 服务器内部错误
502(错误网关)服务器做为网关或代理从上游服务器收到无效响应。
505 HTTP的版本不支持
9.一个TCP连接可以发送多少个HTTP请求(这里也说明了http1.0\1.1和2.0的区别)
Header中的Connection属性决定连接是否持久。
HTTP/1.0中Connection默认是close,每次请求都会重新建立和断开TCP连接。
HTTP/1.1中Connection默认keep-alive的,连接可以复用,不用每次都重新建立和断开TCP连接。如果维持连接,一个TCP连接可以发送多个HTTP请求。但是HTTP1.1中,单个TCP连接在同一时刻只能处理一个请求,即两个请求的生命周期不能重叠。如果同时发送两个请求,服务器返回两个结果,没办法判断响应对应哪个请求,设置了Pipelining技术完成多个请求同时发送,但是浏览器默认关闭。
即HTTP1.1采用连接复用(维持TCP连接,在同一连接上顺序处理多个请求)和服务器建立多个TCP连接来提高页面加载效率。Chrome最多允许对同一个Host建立六个TCP连接。不同浏览器有区别。
HTTP2提供了MultiPlexing多路传输特性,可以在一个TCP连接中同时完成多个HTTP请求。
现实中的HTTP2都是在HTTPs上实现的。
10.浏览器需要加载有几十张图片的网页时,那么这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
如果图片都是HTTPS 连接并且在同一个域名下,那么浏览器在SSL握手之后会和服务器商量能不能用HTTP2,如果能的话就使用Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。
如果发现用不了HTTP2呢?或者用不了HTTPS(现实中的HTTP2都是在HTTPS上实现的,所以也就是只能使用HTTP/1.1)。那浏览器就会在一个HOST上建立多个TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了。
11.建立连接后,客户端出现故障怎么办?
TCP设置有一个保活计时器,服务器每次收到客户端的请求后重新复位计时器,时长通常为2小时,如果2个小时没有收到客户端的任何数据,服务器发送一个探测报文段,之后每隔75s发送一次,发送10个探测报文后没有响应就认为客户端出现问题,关闭连接。
12.token()
token的引入
Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
使用目的:减轻服务器压力,减少频繁查询数据库,使服务器更加健壮。
token的使用
1、用设备号/设备mac地址作为Token(推荐)
客户端:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。
服务端:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。
分析:此刻客户端和服务器端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递,而且服务器端还需要保存;优点是客户端不需重新登录,只要登录一次以后一直可以使用,至于超时的问题是有服务器这边来处理,如何处理?若服务器的Token超时后,服务器只需将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又重新计时。
2、用session值作为Token
客户端:客户端只需携带用户名和密码登陆即可。
服务端:服务端接收到用户名和密码后并判断,如果正确了就将本地获取的sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可。
分析:这种方式使用的好处是方便,不用存储数据,但是缺点就是当session过期后,客户端必须重新登录才能进行访问数据。
参考链接:https://www.jianshu.com/p/24825a2683e6
13.