Cookie,Session,Token

什么是认证(Authentication)

通俗地讲就是验证当前用户的身份,证明“你是你自己”

互联网中的认证:

用户名密码登录

邮箱发送登录链接

手机号接收验证码

只要你能收到邮箱/验证码,就默认你是账号的主人

什么是授权(Authorization)

用户授予第三方应用访问该用户某些资源的权限

在安装手机应用的时候,APP 会询问是否允许授予权限(访问相册、地理位置等权限)

在访问微信小程序时,当登录时,小程序会询问是否允许授予权限(获取昵称、头像、地区、性别等个人信息)

实现授权的方式有:cookiesessiontoken、OAuth

什么是凭证(Credentials)

实现认证和授权的前提是需要一种媒介(证书) 来标记访问者的身份

现实生活中,每个人都会有一张专属的居民身份证,是用于证明持有人身份的一种法定证件

在互联网应用中,一般网站(如掘金)会有两种模式,游客模式和登录模式。游客模式下,可以正常浏览网站上面的文章,一旦想要点赞/收藏/分享文章,就需要登录或者注册账号。当用户登录成功后,服务器会给该用户使用的浏览器颁发一个令牌(token),这个令牌用来表明你的身份

引言:

HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人(但web应用的兴起,像在线购物网站,需要登录的网站,就出现一个问题,要管理会话,记住是哪些人登录系统)。

所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。

什么是 Cookie

cookie是一个非常具体的东西,指的是浏览器里能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把cookie发给服务器。由于cookie是存在客户端上的,所以浏览器加入一些限制确保cookie不被恶意使用。

  • cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。

cookie 重要的属性

属性              说明
domain:            指定 cookie 所属域名,默认是当前域名
path:            指定 cookie 在哪个路径(路由)下生效,默认是 '/'
如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read

Expires/Max-size:           指定时间或秒数的过期时间,没设置的话就和 Session 一样关闭浏览器就失效

secure:            该 cookie 是否仅被使用安全协议传输。安全协议有 HTTPS,SSL等,在网络上传输数据之前先将数据加           密。默认为false。
当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。

httpOnly:           表示禁止通过 JS 访问 Cookie,减少 XSS 攻击。

什么是 Session

session 是另一种记录服务器和客户端会话状态的机制

服务器要知道当前发请求给自己的是谁,为了做这种区分,服务器就要给每个客户端分配不同的‘身份标识’,然后客户端每次向服务器发请求的时候,都携带上这个标识,服务器就知道这个请求来自于谁了。对于客户端怎么保存这个身份标识,对于浏览器客户端,大家默认用cookie保存。服务器用session把用户信息临时保存在服务器上,当离开网站后session会被销毁。

session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中

session.png

session 认证流程:

用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session

请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器

浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名

当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效

根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。cookie和session容易遭受CSRF(跨站请求伪造)攻击,这便引出了token。

Cookie 和 Session 的区别

  • 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
  • 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
  • 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

什么是 Token(令牌)

Acesss Token

访问资源接口(API)时所需要的资源凭证

简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)

token 的身份验证流程:

  • 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
  • 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
  • token 完全由应用管理,所以它可以避开同源策略

Token 和 Session 的区别

Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。

Session 认证只是简单的把 User 信息存储到 Session 里,因为 SessionID 的不可预测性,暂且认为是安全的。而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让某 App 有权利访问某用户的信息。这里的 Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。

如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。

什么是 JWT

JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。

是一种认证授权机制

详情可点下方链接

JSON Web Token

Token 和 JWT 的区别

相同:

都是访问资源的令牌

都可以记录用户的信息

都是使服务端无状态化

都是只有验证成功后,客户端才能访问服务端上受保护的资源

区别:

Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。

JWT: 将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据,JWT可存储数据

参考

https://www.cnblogs.com/moyand/p/9047978.html

详解 Cookie,Session,Token

一文彻底搞懂Cookie、Session、Token到底是什么

傻傻分不清之 Cookie、Session、Token、JWT

阅读剩余
THE END