HTTP、HTTPS、跨域

HTTP、HTTPS、以及跨域

HTTPS相对HTTP协议来说,不是特别安全,HTTPS可以解决以下问题

常规的 HTTP 通信,有以下的问题
1.窃听风险 (eavesdropping): 第三方可以获知通信内容
2.篡改风险(tampering): 第三方可以修改通信内容。
3.冒充风险 (pretending) :第三方可以冒充他人身份参与通信.

https的设计

1.所有信息都是加密传播,第三方无法窃听。
2.具有校验机制,一旦被篡改,通信双方会立刻发现
3.配备身份证书,防止身份被冒充。

HTTP

简介

​ HTTP 的全称是 HyperText Transfer Protocol (超文本传输协议)的缩写,是一种建立在 TCP 上的无状态连接。HTTP 是互联网的基础协议,用于客户端与服务器之间的通信,它规定了客户端和服务器之间的通信格式,包括请求与响应的格式。

​ 基本的工作流程是客户端发送一个 HTTP 请求,服务端收到请求开始处理,处理结束返回给客户端结果,客户端对结果进行处理并展示。

请求报文格式

主要由请求头,请求行,请求体组成

image-20230729163437506

响应报文格式

主要由状态行、响应头、响应正文组成

image-20230729162956896

状态码

  • 1XX 临时性消息

  • 2XX 成功

    200 响应状态成功

  • 3XX 重定向

    301:域名永久移动302;暂时移动304、

  • 4XX 客户端错误

    404 资源找不到

  • 5XX 服务器错误

    500 服务器内部出现错误

HTTPS

简介

​ 超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS**;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

SSL: Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议

TLS: (Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS 记录协议和 TLS 握手协议。

工作原理

image-20230729164533530

1、客户端发起 HTTPS 请求

这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

2、服务端的配置

采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。

这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3、传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。

如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5、传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6、服务端解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7、传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

跨域

简介

跨域问题是指当一个网页的JavaScript代码试图向不同源(协议、域名或端口)的服务器发送HTTP请求时,浏览器为了安全起见会阻止该请求。这是浏览器的一种安全特性,称为同源策略。同源策略的目的是防止恶意网站利用跨域请求窃取用户的敏感信息。

要解决跨域问题,可以采取以下几种方法:

  1. JSONP: JSONP是一种利用script标签的src属性可以跨域加载资源的特性来实现的跨域解决方案。通过在页面中创建一个具有callback参数的script标签,请求的响应将会作为可执行的JavaScript代码来执行。

  2. CORS: CORS(Cross-Origin Resource Sharing)是一种通过服务器设置HTTP响应头来允许跨域请求的机制。在服务器端设置合适的响应头,允许指定的域名访问资源,可以解决跨域问题。

  3. 代理服务器: 可以通过配置一个代理服务器,将前端的请求转发到目标服务器,这样可以绕过跨域限制,但是需要在服务器端进行相应的配置。

  4. WebSocket: WebSocket协议可以建立客户端和服务器之间的双向通信,不受同源策略的限制,因此可以通过WebSocket来解决跨域问题。

解决方案(后端方向)

1、较少情况

直接在相应的controller上加上@CrossOrigin注解

2、配置配置类

单体或者前后端分离项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.xss.server.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
* @author MR.XSS
* @version 1.0
* 2023/7/29 9:05
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders(CorsConfiguration.ALL)
.allowedMethods(CorsConfiguration.ALL)
.allowCredentials(true)
.maxAge(3600);
}
}

3、分布式架构

在gateway中配置配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 配置跨域
* @return
*/
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();

config.setAllowCredentials(Boolean.TRUE);
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.setMaxAge(3600L);

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);

return new CorsWebFilter(source);
}