1-Session,Token,JWT 区别
一、Session
Session 是服务器端使用的一种记录客户端状态的机制,客户端通过 SessionID 来访问服务器端的资源,SessionID 一般是存在 Cookie 中的,也可以通过 URL 传递,但是不推荐这样做。 Session 模式一般如下步骤:
- 用户未登录,输入账号密码,提交到服务器端。
- 服务器端验证账号密码,如果正确,生成 SessionID,将用户信息以及 SessionID 保存到服务器端,通过 Set-Cookie 请求头设置 cookie 到客户端。
- 客户端收到响应后,保存 cookie,下次请求时,自动带上 cookie。
缺点
- 在遭受 DDOS 攻击时,服务器端需要保存大量的 Session 信息,会消耗大量的内存。
- Session 信息保存在服务器端,如果服务器宕机,会丢失所有的 Session 信息,用户需要重新登录。
- Session 信息保存在内存中,如果有多台服务器,用户的 Session 信息无法同步。
- XSS 攻击,如果用户的浏览器存在 XSS 漏洞,攻击者可以拿到用户的 Session 信息,然后伪造用户的 cookie,从而可以伪造用户的身份。
- CSRF 攻击,攻击者可以伪造用户的请求,从而可以拿到用户的 Session 信息,然后伪造用户的 cookie,从而可以伪造用户的身份。
二、Token
Token 是一种客户端认证方式,客户端通过用户名密码请求服务器,服务器验证通过后,返回 Token,客户端收到 Token 后,保存到客户端,下次请求时,自动带上 Token,服务器端通过校验 Token 来验证用户身份。
Token 模式一般如下步骤:
- 用户未登录,输入账号密码,提交到服务器端。
- 服务器端验证账号密码,如果正确,生成 Token,将 Token 保存到服务器端,通过 Set-Cookie 请求头设置 cookie 到客户端或者响应体返回,用户自行设置到 localStorage。
- 客户端收到响应后,保存 cookie 或者 localStorage,下次请求时,自动带上 cookie 或者 localStorage。
- 客户端每次请求时,通过 Authorization 请求头或者 URL 传递 Token。
- 服务器端通过 Authorization 请求头或者 URL 传递 Token,验证 Token,如果验证通过,返回数据,如果验证失败,返回 401 状态码。
缺点
- Token 需要存储到服务端,如果有多台服务器,需要同步 Token。
- Token 一般是不会过期的,如果 Token 被盗取,攻击者可以一直使用 Token,除非用户修改密码或者主动注销 Token。
三、JWT
JWT 是一种 Token 的实现方式,JWT 的全称是 JSON Web Token,是一种轻量级的身份认证和信息交互方式,可以在用户和服务器之间传递安全可靠的信息。 JWT 分为三部分,分别是 Header,Payload 和 Signature,三部分之间用 . 分割,如下所示:
Header.Payload.Signature
Header 存储加密的算法,Payload 存储用户信息,Signature 是对 Header 和 Payload 的签名,用于验证数据的完整性,Payload 一般存储 userId,用于校验用户身份,Signature 是防篡改的,如果数据被篡改,Signature 会验证失败。比如用户 id 被攻击者获取,攻击者如果伪造 Signature,服务器端会验证失败,从而防止攻击者伪造用户身份。这样原来,后端无需存储 JWT,只需使用密码学原理,对签名进行校验即可安全的验证用户身份,未来服务器扩容,只要保证密钥一致即可,无需同步用户登录状态。
JWT 步骤如下:
- 用户未登录,输入账号密码,提交到服务器端。
- 服务端校验账号密码,如果正确,则返回 JWT Token,客户端收到响应后,保存到 localStorage。
- 客户端每次请求时,通过 Authorization 请求头或者 URL 传递 Token。
- 服务器端通过 Authorization 请求头或者 URL 传递 Token,验证 Token,如果验证通过,返回数据,如果验证失败,返回 401 状态码。
- 客户端每次请求时,需要带上 Token,服务器端通过校验 Token 来验证用户身份。
缺点
- JWT 一般是不会过期的,如果 Token 被盗取,攻击者可以一直使用 Token,除非用户修改密码或者主动注销 Token。
- JWT 一般存储在 localStorage 中,如果用户的浏览器存在 XSS 漏洞,攻击者可以拿到用户的 JWT,然后伪造用户的身份。
四、总结
Token 的好处是不容易伪造,但是多台服务器需要同步 Token,但是 JWT 无需存储 Token,利用非对称加密保证用户的身份,未来服务器扩容,只要保证密钥一致即可,无需同步用户登录状态。