在面试过程中,HTTP 被提问的概率还是比较高的。我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的。
URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URL
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
请求行、请求头部、空行、请求数据
四个部分组成,下图给出了请求报文的一般格式。
一个典型的HTTP请求示例:
GET https://www.baidu.com/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://www.baidu.com/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: BAIDUI......
Host (主机和端口号)Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。
Connection:表示客户端与服务连接类型,keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
User-Agent:是客户浏览器的名称
Accept:指浏览器或其他客户端可以接受的传输文件类型
Referer:页面跳转处,表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。
Accept-Encoding:指出浏览器可以接受的编码方式。
Accept-Language(语言种类)指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。
Accept-Charset:指出浏览器可以接受的字符编码。举例:Accept-Charset:iso-8859-1,gb2312,utf-8
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能
HTTP请求主要分为Get和Post两种方法
HTTP:HTTP 是超文本传输协议,是一个基于请求与响应,无状态的(什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。),应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,用于从WWW服务器传输超文本到本地浏览器的传输协议。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
HTTPS是一种通过计算机网络进行安全通信的传输协议,简单讲是HTTP的安全版即HTTP下加入SSL/TLS层。通常,http直接和tcp通信.当使用ssl时,则演变成先和ssl通信,再由ssl和tcp通讯.so,所谓https其实就是身披ssl保护外衣的http.
1.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,HTTPS为了解决信息安全问题,需要再http上再加入加密处理和认证和完整性保护等机制,我们把添加了这些机制的http称之为https(http secure)。
2.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
3.HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
HTTPS采用混合机密机制
在对ssl了解之前先了解两种加密技术.
公开密钥加密使用一对非对称的密钥.一把私钥一把公钥.私钥不能让任何人知道,公钥任何人都能获得.也就是发送密文一方使用对方的公钥进行加密处理,对方收到被加密的信息后,再使用自己的的私钥进行解密.利用这种方法不需要发送用来解密的私钥,也不必担心密钥被盗走.
共享密钥加密(common key crypto system)->也被叫做对称密钥加密.以共享密钥方式加密时必须将密钥也发给对方.
在互联网上转发密钥时,若果通信被监听那么密钥就会落入攻击者之手,另外还得设法安全的保管接收到的密钥.
所以应充分利用两者各有的有事,将多种方法组合起来用于通信.在交换密钥环节适用公开密钥加密方式,之后的建立通信交换报文阶段则适用共享加密方式.
数字证书
客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
这就存在些问题,如何保证公钥不被篡改和信任度?即服务器给客户端发送自己的公开密钥时,如何证明客户端收到的公开密钥就是真实的呢?所以这里就需要借助第三方权威机构 CA (数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。
公钥和私钥都可用于加密和解密
公钥和私钥都可以用于加解密操作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加密,但是不同场景使用不同的密钥来加密,规则如下:
1、私钥用于签名、公钥用于验签
签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。
私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。
2、公钥用于加密、私钥用于解密,这才能起到加密作用
因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!
若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),来对数据进行保存。
实现原理是客户端第一次发送请求后,服务端响应时会在响应头中添加一个set-cookie信息,要求客户端保存cookie信息,客户端在下次请求时,会将这个cookie信息自动发送给服务端,服务端接收后就会根据cookie信息进行匹配。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie是客户端技术,而HttpSession是服务器端技术。
Session技术:服务器端会话技术,Session是服务器和客户端建立连接时添加的一个客户端连接标志技术。
Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie用于标记一个会话(session),这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:将登陆信息等重要信息存放为session 其他信息如果需要保留,可以放在cookie中
客户端浏览器通过DNS解析到www.baidu.com的IP地址xxx,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到IP服务器,然后通过TCP建立传输连接,浏览器发出HTTP请求报文,服务器回复HTTP响应报文,浏览器解析响应报文,并显示在Web页上。收发报文结束,释放TCP连接。
文章参考:https://www.toutiao.com/a6749816291009233416/