JWT资料详解:新手入门教程
一、JWT概述
什么是JWT?
JWT(JSON Web Token)是一种基于开放标准(RFC 7519)的信息传输方式。它通过编码用户身份信息为一个紧凑且自包含的字符串,确保信息在各方之间的安全传输,并可通过验证确保其真实性。JWT主要由三部分构成:头部、负载和签名。
JWT的工作原理
生成JWT:客户端向服务器发出身份验证请求,服务器验证身份后生成JWT并返回客户端。
存储JWT:为确保安全,客户端会将JWT存储在浏览器的localStorage或sessionStorage中。
发送JWT:每次访问受保护的资源时,客户端都会将JWT添加到HTTP请求头中,发送给服务器。
验证JWT:服务器收到请求后,会验证JWT的签名以确认其有效性。
JWT的优势与应用场景
高安全性:通过哈希算法加密信息,确保传输安全。
跨语言支持:支持多种语言实现,适用于多种平台。
方便传输:紧凑的编码字符串,易于通过URL、POST请求或Cookie传输。
应用场景广泛:适用于API认证、单点登录、分布式系统中的用户信息传输等。
二、JWT的基本结构解析Header(头部)
JWT的头部包含两部分:声明类型和算法。例如:
```json
{ "typ": "JWT", "alg": "HS256"}
```
其中,“typ”表示令牌的类型,一般为JWT;“alg”表示用于签名的加密算法。
Payload(负载)
负载部分包含各种声明,这些声明被加密签名以确保安全性。常见的声明类型包括注册声明、公共声明和私有声明。例如:
```json
{ "sub": "", "name": "John Doe", "iat": }
```
其中,“sub”表示JWT所指向的用户;“name”为自定义的用户信息;“iat”表示JWT的创建时间戳。
Signature(签名)
签名用于验证JWT的完整性和真实性。通过采用头部指定的算法(如HS256),对头部和负载的Base64编码字符串进行加密,生成签名。这一部分确保了JWT在传输过程中不被篡改。生成JWT
一、生成头部(Header)生成头部是JWT生成的第一步,以下是生成头部的示例代码:
我们需要定义生成头部的函数:
```python
import base64
import json
def generate_header(algorithm='HS256'):
header = {"typ": "JWT", "alg": algorithm} 定义头部信息,包括类型和算法信息
encoded_header = base64UrlEncode(json.dumps(header).encode('utf-8')) 对头部信息进行URL安全的Base64编码
return encoded_header
def base64UrlEncode(input): URL安全的Base64编码函数
return base64.urlsafe_b64encode(input).rstrip(b'=').decode('utf-8') 对输入进行URL安全的Base64编码并移除可能的填充字符
```
使用上述函数生成头部并打印:
```python
header = generate_header() 生成头部信息并赋值给header变量
print("Header:", header) 打印头部信息
```
输出将是类似于`eyJhbGciOiJIUzI1NiIsInR5cCI6JKdXQi}`这样的URL安全的Base64编码字符串。这是JWT的第一部分。 接下来,我们需要生成负载部分。
二、生成负载(Payload)负载是JWT的第二部分,它包含了用户的信息和声明。以下是生成负载的示例代码:
```python
import base64import jsonimport timedef generate_payload(sub='', name='John Doe'): payload = { "sub": sub, 主题 "name": name, 用户名称 "iat": int(time.time()) 当前时间戳 } encoded_payload = base64UrlEncode(json.dumps(payload).encode('utf-8')) return encoded_payload ``` 使用上述函数生成负载并打印: ```python payload = generate_payload() 生成负载信息并赋值给payload变量 print("Payload:", payload) ``` 输出将是类似于 `eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE5ODMwOTMTcxIg...` 这样的字符串。 这部分包含了用户的身份信息和声明。 我们需要生成签名部分。 签名是验证令牌完整性和真实性的关键部分。 三、生成签名(Signature) 生成签名需要使用头部和负载的信息以及一个密钥。以下是生成签名的示例代码: ```python import hmacimport hashlibdef generate_signature(header, payload, secret): hash_input = f"{header}.{payload}".encode('utf-8') 组合头部和负载作为输入签名内容 signature = hmac.new(secret.encode('utf-8'), hash_input, hashlib.sha256).hexdigest() 使用密钥进行签名并获取十六进制字符串形式的签名 return signature ``` 使用上述函数生成签名并打印: ```python header = "生成的头部字符串" payload = "生成的负载字符串" secret = "my_secret_key"(自己的密钥) signature = generate_signature(header, payload, secret) print("Signature:", signature) ``` 输出将是类似于一串字符的签名,这用于验证令牌的有效性。 四、综合示例 综合以上步骤,完整的JWT生成示例代码如下: ```python import jsonimport timeimport base64import hmacimport hashlibdef generate_header(algorithm='HS256'): 生成头部信息函数定义 def base64UrlEncode(input): URL安全的Base64编码函数定义 def generate_payload(sub='', name='John Doe'): 生成负载信息函数定义 def generate_signature(header, payload, secret): 生成签名函数定义 def generate_jwt(sub='', name='John Doe', secret="my_secret_key"): header = generate_header() payload = generate_payload(sub, name) signature = generate_signature(header, payload, secret) return f"{header}.{payload}.{signature}" jwt_token = generate_jwt() print("JWT Token:", jwt_token) ``` 运行以上代码,将输出完整的JWT令牌。关于如何验证和解析JWT,您可以参考相关文档或示例代码进行学习和实现。希望以上内容能帮助您理解如何生成JWT,并在实际应用中正确使用。如何操作当JWT过期或遭遇篡改:深入了解JWT的安全管理
一、JWT的过期处理当JWT过期时,为了确保安全,需要重新生成一个新的JWT。这涉及到生成和验证JWT的两个关键步骤。
我们来了解如何生成一个JWT:
1. 定义payload(载荷),包含用户信息如用户名、用户ID等,以及JWT的生成时间和过期时间。
2. 使用base64编码和HMAC签名技术,结合密钥对payload进行加密,生成JWT的头部和签名。
以下是生成JWT的示例代码:
```python
import json, time, base64, hmac, hashlib
def generate_payload(sub='', name='John Doe', exp=int(time.time()) + 3600):
payload = {
"sub": sub,
"name": name,
"iat": int(time.time()),
"exp": exp
}
return base64.urlsafe_b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8')
```
接下来,我们验证JWT是否过期:
```python
def verify_expiration(jwt_token, secret):
header, payload, signature = jwt_token.split('.')
decoded_payload = json.loads(base64.urlsafe_b64decode(payload + '==').decode('utf-8'))
if 'exp' in decoded_payload:
return decoded_payload['exp'] > time.time() 返回True表示未过期,False表示已过期
return False 未检测到exp字段,视为无效token
```
二、JWT的篡改处理JWT的安全性依赖于其签名机制。如果收到的JWT签名不正确,说明它可能已被篡改。以下是验证JWT签名的方法:
```python
def verify_signature(header, payload, signature, secret):
hash_input = f"{header}.{payload}".encode('utf-8') 组合头部和载荷生成待签名的数据串
expected_signature = hmac.new(secret.encode('utf-8'), hash_input, hashlib.sha256).digest() 使用密钥生成预期签名
return base64.urlsafe_b64decode(signature + '==') == expected_signature 比较实际签名与预期签名是否一致
def verify_jwt(jwt_token, secret): 验证整个JWT的完整性和签名有效性
header, payload, signature = jwt_token.split('.') 分割头部、载荷和签名部分
sessionStorage与Cookie:Web存储的两大巨头及其风险
在Web开发中,存储数据的方式多种多样,其中sessionStorage和Cookie是两种常见且重要的方法。它们各自有着独特的特性和应用场景,但同时也伴随着一定的安全风险。
sessionStorage:这种存储方式的数据只存在于浏览器的会话期间,也就是在当前窗口或标签页中有效。它为开发者提供了一种临时存储数据的方式,特别适用于存储会话相关的信息。正如一把双刃剑,sessionStorage也存在着被恶意脚本访问的风险。在存储敏感数据时,开发者需要格外小心。
Cookie:与sessionStorage不同,Cookie是存储在服务器端的。它可以通过设置HttpOnly标志来防止被JavaScript访问,增加了一定的安全性。为了确保数据的安全传输,使用Cookie时还需要确保HTTPS协议的使用,以防止中间人攻击。Cookie由于其特性,经常被用于存储用户的登录状态等信息。
示例:
如何将数据存放到localStorage中?
```javascript
localStorage.setItem('token', '你的JWT令牌...'); // 将token存储到localStorage中
```
如何从localStorage中获取token?
```javascript
const token = localStorage.getItem('token'); // 获取token并打印出来
console.log(token); // 输出token的值
```
如何设置HTTP-only cookie?
```javascript
document.cookie = "token=" + encodeURIComponent(jwtToken) + "; path=/; HttpOnly"; // 设置一个带有HttpOnly标志的cookie来存储JWT令牌。
```
(后端)
引入必要的模块:json、时间、base64、hmac和hashlib。为了生成JWT(JSON Web Token),定义一个函数generate_jwt,带有默认参数sub(主题)、name(用户名)和secret(密钥)。
设定header和payload,它们分别代表JWT的头和负载部分。使用给定的secret对header和payload进行加密,生成signature(签名)。将header、payload和经过base64编码的signature拼接起来,形成完整的JWT。
定义handle_login_request函数处理登录请求。验证用户提供的凭据后,如果有效,则生成并返回JWT;否则,返回“无效的凭据”。实现validate_credentials函数模拟验证用户名和密码的过程(实际应用中应从数据库验证)。
调用handle_login_request函数,以“john”和“doe”作为用户名和密码,生成并打印JWT。
(前端)
使用axios库处理HTTP请求。定义loginRequest异步函数,通过POST请求向服务器发送登录信息,将返回的token存储在localStorage中,并返回该token。定义fetchProtectedResource异步函数,使用存储的token作为授权信息,向服务器请求保护资源。
调用loginRequest函数登录,并使用返回的token调用fetchProtectedResource函数获取保护资源。
在移动应用中的使用:在移动应用中,将JWT存储在应用的SharedPreferences、UserDefaults或其他持久化存储介质中。每次发起请求时,从存储中读取JWT并发送给服务器进行验证。这种机制可实现用户身份的安全验证和数据传输的保密性。在API接口的认证世界中,JWT(JSON Web Tokens)扮演着极其重要的角色,它们被广泛应用于请求认证,确保数据在传输过程中的安全性和完整性。下面,我们将深入探讨在Android和iOS应用中,如何利用JWT进行API接口的认证。
Android篇
在Android开发中,我们通常会使用SharedPreferences来存储获取的JWT。当应用启动时,首先会检查是否已经存在有效的JWT。如果不存在,会发起登录请求,获取JWT并存储;如果存在,则使用该JWT获取受保护的资源。
示例代码如下:
```java
public class MainActivity extends AppCompatActivity {
private static final String PREFS_NAME = "MyPrefs";
private static final String TOKEN_KEY = "token";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取存储的JWT
String token = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(TOKEN_KEY, null);
if (token == null) {
// 发起登录请求获取JWT
String jwtToken = loginRequest("john", "doe");
// 存储JWT
prefs.edit().putString(TOKEN_KEY, jwtToken).apply();
} else {
// 使用JWT获取受保护的资源
fetchProtectedResource(token);
}
}
// 省略其他方法...
}
```
iOS篇
在iOS中,我们使用UserDefaults来存储JWT。在发起请求前,会先检查是否存在有效的JWT,如果不存在则发起登录请求。存在则使用该JWT进行受保护资源的获取。
示例代码如下:
```swift
func loginRequest(username: String, password: String) -> String? {
// 发起登录请求并获取JWT,存储到UserDefaults中
// ...省略中间过程...
return nil // 返回JWT或nil(表示失败)
}
func fetchProtectedResource() {
// 获取存储的JWT并发送请求获取受保护的资源
guard let token = UserDefaults.standard.string(forKey: "jwtToken") else { return }
// 使用JWT发起请求...省略中间过程...
}
```
在数字化世界中,每一次点击、每一次请求都需要得到确认,确保它们的有效性。在这个过程中,JWT(JSON Web Tokens)发挥着至关重要的作用。它们是服务器与请求者之间的信任桥梁,承担着验证请求的重要任务。
想象一下,每次你访问一个网站或应用时,服务器都需要确认你的身份。这就像是一扇需要钥匙才能打开的门。而JWT,正是那串能够打开信任之门的密钥。当你的请求来临时,服务器会期待一个包含JWT的证明,只有通过验证这串独特的令牌,服务器才会确认你的身份,并允许你的请求继续前行。
JWT是一种开放标准(RFC 7519),用于在网络之间安全地传输信息。作为一个轻量级的开放标准,JWT被广泛应用于身份验证、授权和信息交换等场景。它们以JSON格式呈现,易于阅读和解析,同时保证了信息传输的安全性。
每当一个请求被发送到服务器时,JWT作为其中的一部分被包含在内。服务器会利用特定的算法对JWT进行验证,确保其未被篡改且属于合法用户。一旦验证通过,服务器就会信任该请求,并作出相应的响应。这种验证机制确保了网络的安全性和可靠性,使得未经授权的请求无法访问敏感资源。
在这个数字化时代,JWT的重要性不言而喻。它们守护着我们的网络世界,确保每一次请求都能得到安全、有效的处理。无论是个人用户还是企业应用,JWT都是不可或缺的信任守护者。它们默默地工作着,确保我们的数字生活更加安全、顺畅。
(后端)
在 Flask 的世界中,我们创建了一个名为 JWT(JSON Web Tokens)的魔法应用。JWT 是一种强大的身份验证机制,它允许我们以安全的方式在不同的服务之间传递信息。让我们看看如何实现它。
我们需要导入一些必要的模块,如 Flask、request 和 jsonify。接着,我们定义了一个函数 `generate_jwt` 来生成 JWT。这个函数需要一个主题(用户ID)、用户名和一个密钥作为参数。它创建了一个头部和负载部分,并使用 HMAC 和 SHA-256 算法生成签名。我们返回这个 JWT。
在我们的应用中,我们有两个路由:`/login` 和 `/protected`。在 `/login` 路由中,我们从请求中获取用户名和密码,如果验证通过,就生成一个 JWT 并返回。否则,我们返回一个错误响应。在 `/protected` 路由中,我们从请求头中获取授权令牌,验证其有效性并决定是否允许访问。
我们还定义了两个辅助函数 `validate_credentials` 和 `verify_jwt` 来验证用户凭据和 JWT 令牌。我们启动应用并开启调试模式。
(前端)
在前端,我们使用 axios 库来发送 HTTP 请求。我们定义了两个异步函数 `loginRequest` 和 `fetchProtectedResource` 来处理登录和保护资源的获取。在登录请求中,我们将用户名和密码发送到后端服务器并存储返回的 JWT 令牌。然后,我们使用这个令牌来获取保护资源。这个过程是异步的,所以我们需要使用 `.then()` 方法来处理返回的令牌并获取资源。我们调用 `loginRequest` 函数来启动整个过程。
文章来自《钓虾网小编|www.jnqjk.cn》整理于网络,文章内容不代表本站立场,转载请注明出处。