当前位置: 首页 > news >正文

跨域(CORS)和JWT 详解

跨域 (CORS) 概念

同源策略 (Same-Origin Policy)
同源策略是一项浏览器安全特性,它限制了一个网页中的脚本如何与另一个来源(域名、协议、端口)的资源进行交互。这对于防止跨站点请求伪造和数据泄露非常重要。

为什么需要跨域?
跨域问题通常发生在前端应用程序试图从不同的域请求数据或资源时。这可能是因为前端应用和后端API托管在不同的域上。跨域解决方案
### CORS (Cross-Origin Resource Sharing)
CORS是一种标准,允许服务器声明哪些源可以访问其资源。在后端Java应用程序中,您可以通过配置响应头来启用CORS。以下是一个Spring Boot示例:

```java
@Configuration
public class CorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("http://localhost:3000")
                        .allowedMethods("GET", "POST");
            }
        };
    }
}
```

这段代码允许来自`http://localhost:3000`的跨域请求访问`/api`端点。

# JSON Web Tokens (JWT) 概念

什么是JWT?
JWT是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式来表示信息,用于在各方之间安全地传输信息。它通常用于对用户进行身份验证和授权。

JWT 结构
JWT由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。
- 头部包含指定JWT的类型和所用的签名算法。
- 载荷包含声明,声明了一些实体(通常是用户)和一些数据。
- 签名用于验证JWT的完整性。 

生成和验证JWT
生成JWT
在Java中,您可以使用库如`jjwt`来生成JWT令牌。以下是一个简单的示例:

```java
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

String token = Jwts.builder()
    .setSubject("user123")
    .signWith(SignatureAlgorithm.HS256, "secretKey")
    .compact();
```

验证JWT
在后端,您可以验证JWT令牌以确保其完整性和有效性。以下是一个示例:

```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;

try {
    Claims claims = Jwts.parser()
        .setSigningKey("secretKey")
        .parseClaimsJws(token)
        .getBody();
    // 验证通过
} catch (SignatureException e) {
    // 令牌无效
}
```

跨域和JWT的结合应用

通常,前端应用会向后端API发送JWT令牌以进行身份验证和授权。后端应用会验证JWT的签名,并根据令牌中的声明执行相应的操作。

以下是一个示例,前端使用JWT令牌在跨域请求中向后端进行身份验证:

```javascript
// 前端示例代码
fetch('http://api.example.com/data', {
    method: 'GET',
    headers: {
        'Authorization': 'Bearer ' + jwtToken
    }
})
.then(response => {
    // 处理响应
});
```

常见问题和最佳实践

 跨域和JWT的常见问题
- 跨域问题:确保正确配置CORS以避免跨域问题。
- JWT安全性:不要在JWT中存储敏感信息,限制令牌的生命周期。

 最佳实践
- 使用HTTPS来保护数据传输。
- 避免将敏感信息存储在JWT中。
- 使用长且随机的密钥来签署JWT。

http://www.lryc.cn/news/221107.html

相关文章:

  • 前端框架Vue学习 ——(二)Vue常用指令
  • Linux 指令心法(十四)`flash_erase` 擦除Flash存储器
  • GoLong的学习之路(二十一)进阶,语法之并发(go最重要的特点)(协程的主要用法)
  • 加快网站收录 3小时百度收录新站方法
  • GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案
  • 图片怎么转换成pdf?
  • 【源码】医学影像PACS实现三维影像后处理等功能
  • DOCTYPE是什么,有何作用、 使用方式、渲染模式、严格模式和怪异模式的区别?
  • Go语言实现HTTP正向代理
  • 第11章_数据处理之增删改
  • 数据时代的新引擎:数据治理与开发,揭秘数据领域的黄金机遇!
  • 使用 Golang 实现基于时间的一次性密码 TOTP
  • 微服务之Nacos配置管理
  • PySpark 优雅的解决依赖包管理
  • UNI-APP_获取手机品牌
  • 新登录接口独立版变现宝升级版知识付费小程序-多领域素材资源知识变现营销系统
  • 「掌握创意,释放想象」——Photoshop 2023,你的无限可能!
  • SQLSugar查询返回DataTable
  • 企业微信开启接收消息+验证URL有效性
  • 电脑访问不到在同网络的手机设备
  • 国内MES系统应用研究报告:“企业MES应用现状”| 百世慧®
  • C++模板元模板实战书籍讲解第一章题目讲解
  • Java在互联网网络安全中的应用(三)
  • VMLogin如何解决跨境电商多账号管理难题?
  • STM32创建工程步骤
  • 软考 系统架构设计师系列知识点之边缘计算(1)
  • vue:写一个数组box和list数组,在保留box数组中原有对象的同时,将list数组中每一个对象插入到box数组后面
  • Python教程:随机函数,开始猜英文单词的游戏
  • Unit2_1:动态规划DP
  • k8s提交spark应用消费kafka数据写入elasticsearch7