赣州新闻网

首页 / 科技

边缘服务器的芯片形态与竞争格局

2020-03-02 · 赣州新闻网 · 科技

什么是认证(Authentication)

  • 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡# z 1 t . 9 G成功)
  • 互联网中的认证: 用户名密码登录 邮箱发送登录链接 手机号接收验证码 只要你能收到邮箱/验证码,就默认你是账号的主人

什么是授权(Authorization)

  • 用户授予第三方应用访问该用户某些资源的权限 你在安装手机应用的时候,APP 会询问是否允许授予权限(访问相册、地理位置等权限) 你在访问微信小程序v h ! 0 4 d i ~ W时,当登录时,小程C ? !序会询问是否允许授予权限(获取昵称、头像、地区、性别等个人信息)
  • 实现授权的方& Y ( Q n式有:cook_ q a A ( 1 | x Die、session、token、OAuth

什么是I d x 6 . M 9凭证(Credentials)

  • 实现认证和授权的前提是需要一种媒介(证书) 来标记访问者的身份 在战国时期,商鞅变法,发明了照身帖。照身帖由官府发放,是一块3 m ` L @ c & `打磨光滑细密的竹板,上面刻有持有人的头像和籍贯信息。国人必须持有,如若没有就被认为是黑户,或者间谍之类的。 在现实生活中,每个人都会有一张专属的居民身份证,是o 5 .用于g } w 1 C + D证明持有~ N ! $ 7 | +人身份的一种法定证件。通过身份证,我们可以办理手机卡/银行卡/个人贷款/交通出行等等,这就是认证的凭证。 在互联网应用中,一般网站(如掘金)会有两种模式,游客模式| r z , ! a 5 ~ A和登录模式。游客模式下,可z a v I以正常浏览网站上面的文章,一旦想要$ d W W _ 4 O点赞/收藏/分享文章,f ` f b g Z S m就需要登录或者注册账号? _ ) ]。当用户登录成功后,服务器会Y u 5 X e Z s y 4给该用户使用的浏览器颁发) 4 P一个令牌(token),这个令牌用来表明你的身份,每次浏览器发送请求时会带上这个令牌,就可以使用游客模式下无法使用的功能。

什么是 Cookie

  • HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求f g G # ^ Z _ 都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
  • cookie 存储在客户端/ ] m: cookie 是服务器发送到用户浏览器并保存在t I v v k ; c [ v本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(B 2 X靠的是 domain)。

cookie 重要的属性

属性 说明 name=value 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型Q B C v M i
- 如果值为 Unicode 字符,需要为字符编码。
- 如果值为二进制数据,则需要使用 BASE64 编码。
domain [ * K : 2 指定 cookie 所属域名,默认* q X ~是当前域名 path 指定 cookie 在哪个路径(路由)下生效,默认是 \ U J 1 -'/\'。
如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read。 maxAge cookie 失效的时间,单位秒。如果为整数,则该 cookie 在 maxAge 秒后失效。如果为负数n r | Q认为 -1。
- 比 expires 好用。
expires 过期时间T % 9 N ` $ s - C,在设置的某个时间点后该 cookie 就会失效# c . # ^。
一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除 secure 该 cookie 是否仅被使用安全协议传输。安全协议有 HTTPS,SSL等,在网络上传输数据之前先s ( 5 s p J :将数据加密。o j z O E默认为false。
当 secureZ O d G 值为 true 时,cookie 在 HTTP 中是无效,在 HTT } I ] P d $ !TPS 中才有效。 httpOnly 如果给某个 cookie 设置了 httpOn: F Cly 属性,Z i r | w J N `则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全

什么是 Session

  • session 是另一种记录5 d - n j v服务器和客户端会话状态的机制
  • session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中


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


  • session 认证流程: 用户第一次请求服务器的时候,服8 L p d | A务器根据用户提交的相关信息,创建对应的 Session 请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器 浏览# 2 W器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Col b = Xo| P ~ a = w ] ]kie 记录此 SessionID 属于哪个域名 当用户第二次访B 8 @ H S问服务器的时候,请求会自动判断此域名下是否存在 CooV s % ~ 7 } tkie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,y x a @ ^ A 7如果找到 Session 证明用户已经登录可执行后面操作。

根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据n 3 u u . o T | X H符串数据,想要设置其他类型的数据,需要将其转换成字符串,Sesv L } Wsion 可以存任意数据类型。

  • 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默& g z认情况下)或者 Session 超时都会失效。
  • 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Se0 R ^ J . c Bssion 可存储数据远高于 Cookiw z & ? y G T W |e,但是当访问量过多,会占用过多的服务器资源。
  • 什么是 Token(令D 0 ] . i 9 `牌)

    Acesss Token

    • 访问资源接口(API)时所需要的资源凭证^ | Y #
    • 简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
    • 特点: 服务端无状态化、可扩展性好 支持移动端设备 安全 支持跨程序调用
    • token 的身份验证流程:


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


    1. 客户端使用用户名跟密码请求登录
    2. 服务端收到请求,去验证用户名与密码
    3. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
    4. 客户端 g w n收到 token 以后,会把它存储起来,比如放在 cookie 里或者) ? A b localStorage 里
    5. 客户端每次向服务端请求资源的时候需要带着服务端签0 u v p ) m 6 _发的 token
    6. 服务 ^ M { g zccess token,无需用户进行额外的[ 0 d s _ w a % q操作。

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


      • Access Token 的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refree X t ? sh Token 就可以获取到新的 TokenD ` r w,如果 Refresh Token 也失效了,用户就只能重新登录了。
      • ReC C y b E = ?fresh Th u loken 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。

      Token 和 Sessit I N , 0 ` [ : 4on 的区别

      • Session 是一种记录服务器和客户端会话状态的机制,使服务端有状J H Q 7 u ;态化,可以记录会话信息。而 T. * b xoken 是令牌= k C C b v,访问资源接口(API)时所需要的资源凭证。TB D - ! r Voken 使服务端无状态化,不会存储会话信息。
      • Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求v 1 1都有签名还能防止监听以及重放攻击I : u h P x,而 Session 就7 M ~ x必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。
      • 所谓 Session 认证只是简单的把 User 信息存储到 Session 里,因为 SessionID 的不可预测性,暂且认为是安全的。而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让某 App 有权利访问某用户的信息。这里的 Token 是唯一的。不可以转移到其它 App上,也不可= u V _ G W p k以转到其它用户上。Session 只提供一种简单的认证,即只要有此 SessionID ,即认为有此 Usec w E Lr 的全部权利。是需% w 0 & U $要严格保密的,这个数据应该只保存在站方,i C i不应该共享给其它网站或者第三方 App。所以简单来说:如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

      什么是 JWT

      • JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
      • 是一种认证授权机制。
      • JWT 是为了在网络应用环境间传递声明而执行% n y v v 8的一种基于 JSON 的开放标准(RFC 7519)。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息v + c 9 W,以便于从资源服务器获取资源。比如用在用户登录上。
      • 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
      • 阮一峰老师的 JSON Web Token 入门教程 讲的非常通俗易懂,这里就不再班门弄斧了& ; W

      JWT 的原理


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


      • JWT 认证流程: 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT 客户端将 token 保存到本地(通常使用 locals^ @ m $torage,也可以使用 cookie) 当用户希望访问F H ^ J一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWT,其内容看起来是下面这样
      Authorization: Bearer <tokeW L T ; b * 5 Vn>
      • 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
      • 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了需要查询数据库的需要
      • 因/ B l i 1 f为 JWT 并不使用 Cookie 的,所以你可以使用任z . K n _ O x何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)
      • 因~ @ 0为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制

      JWJ o [ ,T 的使用方式

      • 客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage4 + `。

      方式一

      • 当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动g 4 v z 3 v发送,但是这样不f U ? O 3 i 9 y *能跨域,所以更好的做法是放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。 GET /calendar/v1/events Host: api.example.com Authorizatir = r _ y H s I ~ e c还需要查询数据库获取用户信息,然后验证 Token 是否有效。
      • JWT: 将 To* I U & Kken 和 Payload 加密k ? L 6 C C别 2 的 160 次方为 1.4615016373309029S : q ` & 9 I w182036848327163e+48,也就是 10 的 48 次方级别 2 的 256 次方为 1.1579208923731619542357098500869 10 的 77 次方,也就是 10 的 77 次方{ # d I : . M f )

      注意:

      1. 以上不能保证数据被恶意篡改,原始数据和哈希值都可能被恶意篡改,要保证不被篡改,可以使用RSA 公钥私钥方案,再配合哈希值。
      2. 哈希算法主要用来防止计算机传输过程中3 = ` ~ M }的错误,早期计算机通过前 7 位数据第 8 位奇偶校验码来保障(12.5% 的浪费效率低),对于一段数据或文件,通过哈希算法生成 12s h d a x8v & n o 4bit 或者 256bit 的哈希值,如m { E h D果校验有问题就要求重传。

      常见问题

      使用 cookie 时需要考虑的问题

      • 因为存储在客户端,容易被客户端篡oken

      使用 session 时需要考虑的问题

      • 将 sessioR A Bn 存储在服务器里面,当用户同时在线量比较多时,这些 session 会占据较多的内存,Y d | e ^ A D m需要在服务端定期的去清理过期的 session
      • 当网站采用集群部署的时K ` & ] T c候,会遇到多台 web 服务器之间如何做 session 共享的问题。因为 sessiox K / Sn 是由单个服务器创建的,但是处理用户请求的服务器不一定是那个创建 sessioe F 0n 的服务器,那么该服务器就无法拿到之前已经放入到 session 中的登录# M ] Q凭证之类的信息了。
      • 当多个应用要共享 session 时,除了以上问题,还会遇到跨域问题,因为不同的应用可能部署的主机不一样,需要在各个应用做好 cookie 跨域的处理。
      • sessionId 是存储在 cookie 中的,假如浏览器禁止 cookie 或不支持 cookie 怎么办? 一般会把 sessioC s X F # b c @ InId 跟在 uj = U W X b | s _rl 参数后面1 S `即重写 url,所以 session 不一定非得需要靠 cookie 实现
      • 移动端对 cookie 的支持不是很好,而 session 需要基于 cookie 实现,所以移动端常用的是 token

      使用 token 时需要Z G F ; Q r [ A考虑的问题

      • 如果你认为用数据库来存储 token 会导致查询时间太长,可以选择放在内存当中。比如 redis 很适合你对 token 查询的需求。
      • token 完全由应用管理,所以它可以避开同源策略
      • token 可以避免 CSRF 攻击(因为不需要 c: s o @ D q a Gookie 了)
      • 移动端对 cooL { 2 q 7kie 的支持不是很好,而 ses^ ( F e * A { esion 需要基于 cookie 实现,所以移动端常用的是 token

      使用 JWT 时需要考虑的问题

      • 因为 JWTc B * 并不依赖 Cookie 的,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资; # Z z v Q源共享问题(CORS)
      • JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
      • JWT 不加密的情况下9 H +,不能将秘L i ` F % # C d T密数据写入 JWT。
      • JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查? G b w F z询5 N ` (数据库的次数。
      • JWT 最大的优势是服务器不再需要存. & u ; X Y L R ,储 Session,使得服务器认证鉴[ v 8 = q %权业务可以方便扩展。但这也是 JWT 最大的缺点:由于服务器不需要存储 Session 状态,因此使用过程中无法废弃某个 Token 或者更改 Token 的权限L n G M K K ;。也就是说一旦 JWT 签发了,到期之前就会始终有效,除非服务器部署额外的逻辑。
      • JWT 本身包含了认证信Y ) 6息,0 A 要 “忘记密码” 的功能,可以随机生成一个新的 一次性的(这点很重要)密码,然后把这个密I u y t o r码发送给用户。

      分布式架构下 session 共享方案

      1. session 复制

      • 任何一个服务器上: 4 . 的 session 发生改变(增删改),该节点会把这个 session 的所有内容序列化,然后广播) B Y U给所有其它节点,不管其他服务器需不需要 session ,以此来保证 session 同步

      优点: 可容错,各个服务器间 sessio@ O ]n 能够实时响应。
      缺点: 会对网络负荷造成一定压力,如果 session 量大的话可能会造成网络堵塞,拖慢服务器性能。

      2. 粘性 session /IP 绑R , *定策略

      • 采用 Ngnix 中的 ip_hash 机制,将某个 ip的所有请求都定向到同一台服c 0 ( f O h * c务器上,即将用户与服务器绑定。 用户第一次请求时,负载均衡器将用户的请求转发到了 A 服务器上,如果负载均衡器设置了粘性 sessiI ` : W ^ c _ Son 的话,那么用户以后的每次请求都会转发到 A 服务器上,相当于把用户和 A 服务器粘到了一块,这就是粘性 session 机d # n制。

      优点: 简单,不需要对 session 做任何处理。
      缺点: 缺乏容错性,如果当前访问的服_ g e h I务器发生故障,用户被3 D G m F e ( c 6 / y aession。
      然而浏览器从来不会主动在关T R L e y Y | h R闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分 session 机制都使用会话 cookie 来保存 session id,而关闭浏p % I n ! 2 4 -览器后m 0 ! } 9 R这个 session id 就消失了,再次连接服务器时也就无法找到原来的 session。如果服务器设置的 cookie 被保存在硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 session id 发送给服务器,则再次打开浏览器仍然能够打开原来的 session。
      恰恰是由于关闭浏览器不会导致 session 被删除,迫使服务器为 session 设置了一个失效时间,当距离客户端上一次使用 session 的时间超过这个失效时间时,服务器就认为客户端已经停止 b Q了活动,才会把 session 删除以节省存储空间。

      后语

      • 本文只是基于自己的理解讲了理论知识,因为对后端/算法知识F v J y M ! (不是很熟,如有谬误,还请告知,万分感谢
      • 如[ F b - 7 = p :果本文对你有所帮助,还请点个赞~~


      作者:秋天不落叶
      链接:ht= [ q } o t D Q 3tps://juejin.im/post/5e055d9ef265da33997a42cc

    做好居民生活需求文章龙南芯片格局服务