目录
Cookie、Session、Token、JWT 看一篇就够了
什么是认证(Authentication)
什么是授权(Authorization)
什么是凭证(Credentials)
怎么让浏览器记住我是谁?
什么是 Cookie
使用 cookie 时需要考虑的问题
什么是 Session
session 认证流程:
使用 session 时需要考虑的问题
Cookie 和 Session 的区别
什么是 Token(令牌)
全称叫 Acesss Token
token 的身份验证流程:
使用 token 时需要考虑的问题
什么是 Refresh Token
refresh token
Token 和 Session 的区别
什么是 JWT
JWT 的原理
JWT 认证流程:
使用 JWT 时需要考虑的问题
Token 和 JWT 的区别
使用加密算法时需要考虑的问题
近些年来,关于身份验证的安全越来越受到重视,基本上现在开发的系统,都要做一些身份验证。在以前的项目我们一般使用session或者cookie来存储已登录的用户信息,这样到达一个免除重复登录的问题。
总而言之,后端实际上就是在做一个事情,验证你是谁?在这个验证的过程中,就涉及到一些认证,授权,凭证等过程。
字多你就挑有颜色的看啊!!!
通俗地讲就是验证当前用户的身份,证明“你是你自己”。
(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡成功。)
互联网中的认证:
用户名密码登录邮箱发送登录链接手机号接收验证码邮箱/验证码,你就是账号的主人通俗地讲就是用户授予第三方应用访问该用户某些资源的权限。
比如手机安装APP的时候,会询问是否允许授予权限(访问相册、位置等权限)
比如在访问微信小程序时,当登录时,小程序会询问是否允许授予权限(获取昵称、头像、地区、性别等个人信息)
比如网站登录的时候,可以使用QQ,微信进行登录。(访问你的个人资料,好友信息等)
实现授权的方式有:cookie、session、token、OAuth 等
实现认证和授权的前提是需要一种媒介(如证书)来标记访问者的身份。
比如生活中,每个人都会有一张专属的居民身份证,是用于证明持有人身份的一种法定证件。通过身份证,我们可以办理手机卡/银行卡/个人贷款等等,这就是认证的凭证。什么是会话跟踪技术?
HTTP 是无状态的协议(就是说,它对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。
所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我?),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器,而这个状态需要通过 cookie 或者 session 去实现。
cookie是一种记录服务器和客户端会话状态的机制。
cookie 存储在客户端(本机的缓存文件夹中):cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。cookie 存储在客户端(本机的缓存文件夹中):cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。session也是一种记录服务器和客户端会话状态的机制。
session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中请求图示:
因为session在BS架构中最常用,就讲多一点。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。
如今,微服务架构盛行,除去传统的cookie和session技术,还多一个 Acesss Token 令牌技术。
就是一个访问资源接口(API)时所需要的资源凭证。
一般token 的组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)。
特点:
- 服务端无状态化、可扩展性好 - 支持移动端设备 - 安全 - 支持跨程序调用,就是不受域名限制。使用场景:
一般网站就是,当用户登录成功后,服务器会给该用户使用的浏览器颁发一个令牌(token),这个令牌用来表明你的身份,每次浏览器发送请求时会带上这个令牌,就可以使用系统了。
服务端生成:
客户端保存: 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里。
Token是无状态协议中认证用户的一种形式,相比于传统的cookie,不受域名限制。
作为后端开发人员,是否有过这种经历,在使用接口测试的时候,往往要求填写token信息,然而这token需要运行前端项目,然后登陆,然后生成一个token,然后把这个token放到我们的接口调试器中, 再模拟发出请求。而且token设有有效期,隔三差五重新登录,总之,你要想测试你的后端接口,还需要跑前端项目,很麻烦有木有?于是就有了refresh token。
也是一种token技术,是专门用来刷新Accesstoken的token。
如果没有 refresh token,也可以刷新 access token,但每次刷新都要用户输入登录用户名与密码,会很麻烦。有了 refresh token,可以减少这个麻烦,当前token过了有效期以后,就在客户端中直接用 refresh token 去更新 access token,获得新的token,然后就可以愉快的玩耍了,无需用户再登录之类的额外操作。
特点:
Access Token 的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。Refresh Token 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。多说一句: Session 只提供一种简单的认证,即只要有此 SessionID ,即认为有此 User 的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方 App。
而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让某 App 有权利访问某用户的信息。这里的 Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。
所以简单来说:如果用户数据需要和第三方共享,或允许第三方调用API接口,用Token。 如果用户数据需要和第三方共享,或允许第三方调用API接口,用Token。
JWT就是token的一种实现形式,通过在客户端存储payload来降低服务端压力。
JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
是一种认证授权机制。
JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。
用点号分为三段,分别表示头部Header、负载Payload、签名Signature
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViMJWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
相同:
都是访问资源的令牌都可以记录用户的信息都是使服务端无状态化都是只有验证成功后,客户端才能访问服务端上受保护的资源区别:
Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。JWT:将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。token 可以是一个短字符串,如下
25d9048a-dacb-45c3-ac0c-28be4340c8c1JWT 通常是一个长字符串,以点分割三段,如下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTMzMDkyNDUsInVzZXJuYW1lIjoiYWRtaW4ifQ.BjiEVjhapNvJTTpRFrWFN8_-Ng9YLo14XcHv3h1dcoA可以看出都是一些加密的字符串。顺便提一下加密问题。
在很久以前,常用的是这样 MD5、AES、Base64算法数据加密。
现在基本上都是推荐使用哈希算法来加密。
绝不要以明文存储密码。
永远使用 哈希算法 来处理密码,绝不要使用 Base64 或其他编码方式来存储密码,这和以明文存储密码是一样的,使用哈希,而不要使用编码。因为编码以及加密,都是双向的过程,而密码是保密的,应该只被它的所有者知道, 这个过程必须是单向的。哈希正是用于做这个的,从来没有解哈希这种说法, 但是编码就存在解码,加密就存在解密。绝不要使用弱哈希或已被破解的哈希算法,像 MD5 或 SHA1 ,只使用强密码哈希算法。绝不要以明文形式显示或发送密码,即使是对密码的所有者也应该这样。目前常见的前后端鉴权方式
Session-CookieToken 验证(包括 JWT,SSO)OAuth2.0(开放授权)———————————————— 原文链接:https://blog.csdn.net/ITBigGod/article/details/106993176