我需要在哪里使用 JWT?
Where do I need to use JWT?
撇开 structure and protocol,我想知道 JWT 在 client/server 通信中的位置?
- 这里是用来替换身份验证和会话 cookie 的吗?
- 这里是为了减轻服务器在数据库或内存中存储会话令牌的负担吗?
- 客户是否需要确保他们从预期的服务器接收数据,如果这不是问题,我就不需要 JWT 了吗?
- 当连接 HTTPS/SSL 时,服务器到服务器的通信是否有必要或良好做法?
IMO JWT 在发行者(生成 JWT)和接收者(验证 JWT)属于不同自治方时最有用。虽然可以,但是没必要把authentication/session-cookie/token-storage/etc换成JWT
JWT 只是一种流行的基于 JSON 的安全令牌格式。
JWT 令牌并不是为了取代 session cookie 而发明的。它们主要用于保护网络 APIs(请求数据)。 Session 另一方面,cookie 用于 Web 应用程序,您在其中登录用户并在每次请求(请求页面)时自动发送 cookie。
JWT 令牌作为承载身份验证方案的一部分包含在授权 HTTP header 中。使用不记名方案身份验证的主要优点是它不易受到 CSRF 攻击,因为您的脚本需要明确地将令牌附加到请求并且可以使用 cross-domain(与 cookie 不同)。
不记名方案身份验证确实需要 HTTPS 连接,因为只要令牌有效,任何设法窃取令牌的人都可以使用它来访问 API。
OAuth2 等安全协议使用 JWT 令牌来保护 API。 OpenID Connect 使用 JWT 令牌对 Web 应用程序进行身份验证,但将令牌存储在 cookie 中。
由于 JWT 令牌由发行者(执行身份验证的服务器)进行数字签名,因此无需再次与服务器对话即可对其进行验证。数字签名允许您使用私钥对一段数据(在本例中为 JWT 令牌)进行签名,接收令牌的服务器只需要 public 密钥来验证数据的 none 是否已更改。所以 API 服务器只需要来自授权服务器的 public 密钥(不是秘密的)来信任它发布的令牌。 API 的客户端带上令牌,API 服务器无需与授权服务器对话即可对其进行验证。
JWT 到底是什么?
它是一个只有服务器才能生成的令牌,可以包含数据的有效负载。
有什么意义?
JWT 负载可以包含用户 ID 等内容,这样当客户端向您发送 JWT 时,您可以确保它是由您发出的,并且您可以看看发给谁了。
它可以用在什么地方?
通常,在 RESTful APIs, 服务器不得使用任何类型的会话。
它与使用会话有何不同?
在典型的会话流程中,浏览器发送一个包含令牌的 cookie,然后在服务器[=56]匹配=] 到服务器使用 对用户进行身份验证的一些数据。
在 JWT 流程中,令牌本身包含数据。服务器 解码令牌以仅对用户进行身份验证。服务器上没有存储数据。
使用 JWT 的典型身份验证流程是什么?
- 用户凭据已发送至
/signin
/signin
returns 一个 JWT(使用密钥签名)
- JWT 存储在
localStorage
- 每次请求都会发送 JWT(到 API)
- 服务器可以读取 JWT 并从中提取用户 ID
Jwt 包含 algorithm.data.signature 的编码形式,因此如果用户尝试 fiddle 使用用户 ID 或 jwt 中保存的任何其他数据,则 jwt 签名将无效。
Jwt 是经过编码的(未加密),因此任何人都可以读取 jwt 的数据组件(参见 jwt.io 示例)。因此建议不要在 jwt 中存储密码等任何秘密。
还建议在发出包含 jwt 的 Web 请求时使用加密连接 (SSL/TLS),否则攻击者可以窃取 jwt 并使用它来冒充您。
撇开 structure and protocol,我想知道 JWT 在 client/server 通信中的位置?
- 这里是用来替换身份验证和会话 cookie 的吗?
- 这里是为了减轻服务器在数据库或内存中存储会话令牌的负担吗?
- 客户是否需要确保他们从预期的服务器接收数据,如果这不是问题,我就不需要 JWT 了吗?
- 当连接 HTTPS/SSL 时,服务器到服务器的通信是否有必要或良好做法?
IMO JWT 在发行者(生成 JWT)和接收者(验证 JWT)属于不同自治方时最有用。虽然可以,但是没必要把authentication/session-cookie/token-storage/etc换成JWT
JWT 只是一种流行的基于 JSON 的安全令牌格式。
JWT 令牌并不是为了取代 session cookie 而发明的。它们主要用于保护网络 APIs(请求数据)。 Session 另一方面,cookie 用于 Web 应用程序,您在其中登录用户并在每次请求(请求页面)时自动发送 cookie。
JWT 令牌作为承载身份验证方案的一部分包含在授权 HTTP header 中。使用不记名方案身份验证的主要优点是它不易受到 CSRF 攻击,因为您的脚本需要明确地将令牌附加到请求并且可以使用 cross-domain(与 cookie 不同)。
不记名方案身份验证确实需要 HTTPS 连接,因为只要令牌有效,任何设法窃取令牌的人都可以使用它来访问 API。
OAuth2 等安全协议使用 JWT 令牌来保护 API。 OpenID Connect 使用 JWT 令牌对 Web 应用程序进行身份验证,但将令牌存储在 cookie 中。
由于 JWT 令牌由发行者(执行身份验证的服务器)进行数字签名,因此无需再次与服务器对话即可对其进行验证。数字签名允许您使用私钥对一段数据(在本例中为 JWT 令牌)进行签名,接收令牌的服务器只需要 public 密钥来验证数据的 none 是否已更改。所以 API 服务器只需要来自授权服务器的 public 密钥(不是秘密的)来信任它发布的令牌。 API 的客户端带上令牌,API 服务器无需与授权服务器对话即可对其进行验证。
JWT 到底是什么?
它是一个只有服务器才能生成的令牌,可以包含数据的有效负载。
有什么意义?
JWT 负载可以包含用户 ID 等内容,这样当客户端向您发送 JWT 时,您可以确保它是由您发出的,并且您可以看看发给谁了。
它可以用在什么地方?
通常,在 RESTful APIs, 服务器不得使用任何类型的会话。
它与使用会话有何不同?
在典型的会话流程中,浏览器发送一个包含令牌的 cookie,然后在服务器[=56]匹配=] 到服务器使用 对用户进行身份验证的一些数据。
在 JWT 流程中,令牌本身包含数据。服务器 解码令牌以仅对用户进行身份验证。服务器上没有存储数据。
使用 JWT 的典型身份验证流程是什么?
- 用户凭据已发送至
/signin
/signin
returns 一个 JWT(使用密钥签名)- JWT 存储在
localStorage
- 每次请求都会发送 JWT(到 API)
- 服务器可以读取 JWT 并从中提取用户 ID
Jwt 包含 algorithm.data.signature 的编码形式,因此如果用户尝试 fiddle 使用用户 ID 或 jwt 中保存的任何其他数据,则 jwt 签名将无效。
Jwt 是经过编码的(未加密),因此任何人都可以读取 jwt 的数据组件(参见 jwt.io 示例)。因此建议不要在 jwt 中存储密码等任何秘密。
还建议在发出包含 jwt 的 Web 请求时使用加密连接 (SSL/TLS),否则攻击者可以窃取 jwt 并使用它来冒充您。