安全赋能之鉴权——区分Cookie、Session、Token

在最近的安全赋能培中,对安全漏洞原理与安全测试方法的分类做个简单归类:
若攻击的直接对象是服务器,则是利用编码漏洞(SQL、CSV、XSS)来进行攻击,嵌入恶意代码来实现下一步目标(如在cookie植入代码,攻击用户等);
若攻击直接对象是用户,围绕的中心是鉴权(账号密码、cookie、sessionID、token等),为了获取权限进行下一步操作(攻击服务器等)
其中,权限越权在安全测试是必做项,涉及到常见的鉴权对象——Cookie、Session、Token,我曾有做过深入了解,想必也有一些伙伴对这三个仍没有清晰的区分,因此我写这篇文章抛砖引玉,简单探讨一下三者的联系与区别。
一 、什么是认证(Authentication)
通俗地讲就是验证当前用户的身份,证明“你是你自己”
二、什么是授权(Authorization)
用户授予第三方应用访问该用户某些资源的权限
实现授权的方式有:cookie、session、token等
三、什么是凭证(Credentials)
实现认证和授权的前提是需要一种媒介(证书) 来标记访问者的身份
在互联网应用中,一般网会有两种模式,游客模式和登录模式。游客模式下,可以正常浏览网站上面的文章,一旦想要点赞/收藏/分享文章,就需要登录或者注册账号。当用户登录成功后,服务器会给该用户使用的浏览器颁发一个令牌(token),这个令牌用来表明你的身份,每次浏览器发送请求时会带上这个令牌,就可以使用游客模式下无法使用的功能。
四、什么是 Cookie
HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
cookie的验证流程:
客户端向服务器发送请求,请求中包含了Cookie。
服务器接收到请求后,读取请求中的Cookie。
服务器根据Cookie中的信息进行验证,例如检查Cookie中的用户名和密码是否正确,或者检查Cookie中的Token是否有效。
如果验证成功,服务器会处理请求,并返回响应给客户端。如果验证失败,服务器可能会拒绝请求,或者要求客户端重新登录。
在处理完请求后,服务器可以设置新的Cookie,将新的Cookie返回给客户端,以便客户端在后续的请求中携带新的Cookie。
什么是 Session
session 是另一种记录服务器和客户端会话状态的机制
session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中:
客户端发送请求到服务器,请求中包含了用户的标识,如用户ID、用户名等。
服务器根据用户标识查找对应的Session对象,如果找不到,则创建一个新的Session对象,并分配一个唯一的Session ID。
服务器将Session ID作为响应的一部分返回给客户端,通常是将Session ID存储在Cookie中,客户端会自动携带这个Cookie。
客户端在后续的请求中会自动将Cookie发送给服务器,服务器通过读取Cookie中的Session ID找到对应的Session对象。
当服务器处理请求时,可以通过Session对象来获取用户的信息,例如用户的登录状态、购物车信息等。
当用户完成操作后,可以手动结束Session,或者由服务器根据一定的条件自动结束Session。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。
Cookie 和 Session 的区别
安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
什么是 Token(令牌)
Acesss Token
访问资源接口(API)时所需要的资源凭证
简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
特点:
服务端无状态化、可扩展性好
支持移动端设备
安全
支持跨程序调用
token 的身份验证流程:
客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
客户端每次向服务端请求资源的时候需要带着服务端签发的 token
服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据
每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 to
安全赋能之鉴权——区分Cookie、Session、Token
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



