JWT认证机制: 做为目前前后端分离开发中用户身份认证最流行一种解决方案,叙述一下我的理解,以供参考。
Session 的优缺点:
缺点:
- session信息存在服务器,如果用户登录过多,会过多占用服务器存储空间。
- session依赖于cookie,如果cookie被利用,可能会产生CSRF跨站请求伪造。
- 对于分布式的网站应用,如果session是存在服务器内存中,session共享会成为问题。
优点:
- session可以存放敏感数据
JWT认证机制和session认证机制有何区别?
⚀ 优点:jwt token存储到客户端,不占用服务器存储空间。
⚀ 缺点:jwt token不要存敏感信息。
客户端与服务器之间的交互过程,做了一张图来分析,如下图所示:
JWT token 是一个字符串,由3部分组成,之间以 . 隔开
# 生成的JWT token 字符串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
三部分可以分为header,payload,signature
header: 头部
{
"token类型",
"签名加密算法"
}
# 使用base64对头部内容进行编码加密,生成字符串就是header
payload: 载荷:保存有效的数据。
{
"user_id": "用户id",
"username": "用户名",
"mobile": "手机号",
...
"exp": "jwt token有效时间"
}
# 使用base64对载荷内容进行编码加密,生成字符串就是payload
signature: 签名信息,防止jwt token被伪造。
签名验证。
# 签名生成过程就是:服务器在生成jwt token时,会将header和payload字符串进行拼接,用.隔开。之后会
使用一个只有服务器知道的密钥对拼接后的内容进行加密,signature的内容就是加密之后生成的字符串。
- For example:
客户端和服务器之间的关系就和我们每个人一样!!
我们每个人出生都有一个身份信息去辨识,我们现在把服务器比作公安局 ,服务器生成的字符串 JWT token 就是一个身份证号。
现在我们满足年龄需要使用身份证时,就要去公安局去办理领取,公安局把办理好身份证交给你,下次你在拿身份证过来公安局用的时候,你就把你的身份证交给公安局去验证,而如何知道你身份真假,自然就有中间过程的防伪技术
- JWT认证使用注意点
- payload不要存放敏感数据。
- 服务器密钥需要保存好。
- 如果可以,请使用https网络协议。
希望可以帮助到工作中需要的程序员们!