cookie,session,jwt,token
-
Cookie:
-
Cookie 是由服务器发送给客户端的小型数据片段,存储在客户端的浏览器中。
-
用于在客户端保持用户的会话状态,可以包含诸如用户标识、会话 ID 等信息。
-
每次客户端与服务器通信时,浏览器会自动在请求中包含相应的 Cookie。
-
Cookie 可以设置过期时间,可以是会话级别的临时 Cookie,也可以是长期保存在客户端的持久性 Cookie。
-
生成 Cookie:可以使用 HttpServletResponse 对象的 addCookie() 方法来生成 Cookie。
Cookie cookie = new Cookie("cookieName", "cookieValue"); response.addCookie(cookie);
-
获取 Cookie:可以使用 HttpServletRequest 对象的 getCookies() 方法来获取客户端发送的所有 Cookie。
Cookie[] cookies = request.getCookies();
-
-
Session:
-
Session 是在服务器端存储的关联特定用户会话的数据结构。
-
当用户访问应用程序时,服务器会为每个用户创建一个唯一的会话 ID,并将该会话 ID 存储在 Cookie 中,用于标识用户会话。
-
服务器可以使用会话来存储用户的状态信息,以便在用户与服务器之间的多次请求之间保持用户状态。
-
生成 Session:在 Java Web 应用中,可以通过 HttpServletRequest 对象来创建或获取 Session。
HttpSession session = request.getSession();
-
获取 Session:可以直接通过 HttpServletRequest 对象来获取当前会话的 Session。
HttpSession session = request.getSession();
-
-
JWT (JSON Web Token):
- JWT 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。
- JWT 由头部、载荷(Payload)和签名组成,通常以 Base64 编码的字符串形式存在。
- JWT 是无状态的,信息被加密在 token 内部,因此服务端不需要存储 token 信息。
- 用户验证成功后,服务端生成一个 JWT 并返回给客户端,客户端在接下来的请求中携带 JWT 来进行身份验证。
-
Token:
- 在一般情况下,Token 可以指代各种用于身份验证和授权的令牌,比如 JWT 就是一种 Token。
- Token 是一种用于访问控制的凭证,用于证明持有者的身份。
- 通过在每次请求中传递 Token,服务器可以验证用户的身份和权限,而无需依赖服务器端存储用户信息。
区别:
- Cookie 是存储在客户端(浏览器)中的数据,用于在客户端保持用户会话状态;而 Session 数据存储在服务器端。
- JWT 是一种特定格式的 token,可用于在不同服务之间安全地传输信息,它是无状态的;而一般的 Token 可能是指各种形式的身份验证令牌。
- Cookie 和 Session 都是基于服务器生成唯一标识来识别用户,而 JWT 则是通过加密 token 内部的信息来验证身份。
在实际应用中,选择何种方式取决于具体需求和安全考虑。Cookie 和Session 更适合传统的 Web 应用,而JWT 更适合分布式系统和前后端分离的应用。
补充: JWT Token
- 用户提交登录信息:用户在前端页面输入用户名和密码,然后将其发送给后端服务器。
- 后端验证登录信息:后端服务器接收到用户提交的登录信息后,首先进行验证,比如检查用户名和密码是否匹配等。如果验证通过,则继续下一步;否则返回错误信息给前端。
- 生成JWT Token:在验证通过后,后端服务器生成一个JWT Token,Token中包含了用户的身份信息以及其他必要的数据,比如用户ID、角色等。可以使用第三方库,如jsonwebtoken来生成JWT Token。
- 存储Token到Redis:将生成的Token存储到Redis数据库中。可以使用用户ID作为Key,Token作为Value,设置过期时间等相关配置。
- 设置Cookie:后端服务器将生成的Token作为值设置到Cookie中,并设置相关的Cookie属性,如域名、路径、过期时间等。然后将Cookie发送给客户端。
- 客户端存储Cookie:浏览器收到后端发送的Cookie后,会自动将Cookie存储在本地。之后,每次客户端向服务器发送请求时,浏览器会自动在请求头中携带该Cookie。
- 验证Token:后端服务器在接收到客户端请求时,会从Cookie中获取Token,并解析Token的内容。可以使用相应的JWT库,如jsonwebtoken来验证Token的有效性、完整性,并获取其中的用户身份信息。
- 验证Redis中的Token:后端服务器从Redis中获取存储的Token,并与解析出的Token进行比对,确保Token在Redis中没有被篡改或过期。
- 身份验证通过:如果Token验证通过且Redis中的Token也验证通过,则说明用户的登录状态有效,可以根据需要进行相应的操作,比如返回用户数据或执行其他业务逻辑。