理解Web开发中的身份验证机制:Cookie、Session和JWT

1. Cookie

什么是Cookie?

Cookie是一种存储在浏览器的数据,用于保存服务器返回给客户端的信息。在下一次访问该网站时,客户端会将保存的Cookie一同发送给服务器,从而实现自动登录、保存浏览历史、身份验证等功能。

Cookie的基本属性

  • Name: Cookie的名字
  • Value: Cookie的值
  • Path: 定义了Web站点上可以访问该Cookie的目录
  • Expires: 表示Cookie的过期时间,即有效值,在该时间之前Cookie有效
  • Size: 表示Cookie的大小

Cookie的常用方法

// 创建Cookie对象
new Cookie(String name, String value)

// 获取Cookie的值
getValue()

// 获取Cookie的名字
getName()

// 设置Cookie的有效期
setMaxAge(int expiry)

// 设置Cookie的作用域
setPath(String uri)

HttpServletRequest和HttpServletResponse对Cookie进行操作的常见方法

// 将Cookie发送给客户端进行保存
response.addCookie(Cookie cookie)

// 获取客户端传过来的所有Cookie对象
request.getCookies()

2. Session

什么是Session?

Session表示会话,是指一个浏览器和一个服务器进行通信的过程。Session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId。

Session的使用方式

客户端的Cookie存放session_id,服务端的Session保存用户信息。浏览器再次访问服务器时根据session_id到Session中查找用户信息。

3. Token(JSON Web Token)

什么是Token?

Token一般翻译成令牌,用于验证用户身份的数据。它可以用于URL传参、POST提交,也可以夹在HTTP的header中。Token相当于Session中的session_id,是一个字符串,存放在浏览器中。

JSON Web Token(JWT)由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。

1. Header(头部)

JWT的头部通常由两部分组成:令牌的类型(typ)和使用的加密算法(alg)。这部分通常使用Base64Url编码,但并不对其加密,因为它需要在客户端被解码以获取信息。

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload(负载)

JWT的负载包含了一些声明。声明是关于实体和其他数据的声明。有三种类型的声明:注册声明、公共声明和私有声明。

注册声明(Registered Claims): 这些是预定义的声明,包括iss(签发者)、sub(主题)、aud(受众)、exp(过期时间)、nbf(生效时间)和iat(签发时间)等。

公共声明(Public Claims): 这些声明被定义为在JWT中没有强制使用的声明,但是可以根据需要添加到JWT的负载中。

私有声明(Private Claims):这些是自定义的声明,用于在JWT的两个部分之间共享信息。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3. Signature(签名)

为了创建签名部分,你需要使用编码的头部、编码的负载和一个密钥,然后使用指定的算法(在头部的alg字段中指定)对它们进行签名。签名用于验证消息在传递过程中是否被篡改。
 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

最终,JWT的结构如下

header.payload.signature

这三个部分通过点号连接,形成一个完整的JWT。在实际应用中,这个JWT可以被发送到服务器,并在需要的时候进行验证和解码,以获取负载中的信息。

4. 对于三者的理解

a. Token生成于服务端,存储在客户端,避免了大量Session对象的存储带来的内存消耗。对于用户量庞大的系统或分布式系统,这是一种高效的身份验证方式。

b. SessionId存储在服务器内存,Session保存的用户信息也存在服务器内存或数据库。Cookie接收保存服务器发来的SessionId,浏览器每次发送请求都会带上Cookie的数据。

c. Token是服务器加密的用户信息,服务器将Token发给浏览器,浏览器用Cookie或Storage保存Token。每次发送请求时,浏览器带上Token,服务器解密并确认用户登录。这种方式避免了服务器存储大量Session信息的压力,同时提高了系统的可扩展性。

通过深入理解Cookie、Session和JWT,我们能够更好地选择适合项目需求的身份验证机制,保障系统的安全性和性能。在Web开发中,灵活运用这些机制,将为用户提供更流畅、安全的使用体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekInk失控

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值