最新公告
  • 欢迎您光临站壳网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    正文概述 webmaster   2020-03-2   341

    大家好,我是Guide哥!相信很多人对认证授权方面都不是特别了解,搞不清Session认证、JWT以及 Cookie 这些概念。所以,根据我根据日常对这部分学习已经在项目中的实际运用总结了这8 个相关的问题并且附上了详细的回答(这篇文章这么晚才发的原因)。

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    所有问题如下,开始看答案之前不妨自己测验一下自己究竟能回答几个。

    ps:部分问题其实我在之前写JWT相关的文章的时候已经提到过了,看过的朋友看一下自己还记得不?

    1. 认证 (Authentication) 和授权 (Authorization)的区别是什么?
    2. 什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ?
    3. Cookie 和 Session 有什么区别?如何使用Session进行身份验证?
    4. 如果没有Cookie的话Session还能用吗?
    5. 为什么Cookie 无法防止CSRF攻击,而token可以?
    6. 什么是 Token?什么是 JWT?如何基于Token进行身份验证?
    7. 什么是OAuth 2.0?
    8. 什么是 SSO?

    1. 认证 (Authentication) 和授权 (Authorization)的区别是什么?这是一个绝大多数人都会混淆的问题。

    首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。

    说简单点就是:

    认证 (Authentication): 你是谁。

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    授权 (Authorization): 你有权限干什么。

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    稍微正式点(碌)的说法就是:

    • Authentication(认证) 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
    • Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。

    这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。

    2. 什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ?

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    2.1 什么是Cookie ? Cookie的作用是什么?

    Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

    维基百科是这样定义 Cookie 的:Cookies是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。简单来说: Cookie 存放在客户端,一般用来保存用户信息。

    下面是 Cookie 的一些应用案例:

    • 我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。
    • 使用Cookie 保存 session 或者 token ,向后端发送请求的时候带上 Cookie,这样后端就能取到session或者token了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。
    • Cookie 还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为HTTP协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie

    2.2 如何在服务端使用 Cookie 呢?

    这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot,更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。

    1)设置cookie返回给客户端

    1. @GetMapping("/change-username"
    2. public String setCookie(HttpServletResponse response) { 
    3.     // 创建一个 cookie 
    4.     Cookie cookie = new Cookie("username""Jovan"); 
    5.     //设置 cookie过期时间 
    6.     cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days 
    7.     //添加到 response 中 
    8.     response.addCookie(cookie); 
    9.  
    10.     return"Username is changed!"

    2) 使用Spring框架提供的@CookieValue注解获取特定的 cookie的值

    1. @GetMapping("/"
    2. public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) { 
    3.     return"Hey! My username is " + username; 

    3) 读取所有的 Cookie 值

    1. @GetMapping("/all-cookies"
    2. public String readAllCookies(HttpServletRequest request) { 
    3.  
    4.     Cookie[] cookies = request.getCookies(); 
    5.     if (cookies != null) { 
    6.         return Arrays.stream(cookies) 
    7.                 .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", ")); 
    8.     } 
    9.  
    10.     return"No cookies"

    3. Cookie 和 Session 有什么区别?如何使用Session进行身份验证?

    Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

    Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

    那么,如何使用Session进行身份验证?

    很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下:

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    Session Based Authentication flow

    • 用户向服务器发送用户名和密码用于登陆系统。
    • 服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储 起来。
    • 服务器向用户返回一个 SessionID,写入用户的 Cookie。
    • 用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。
    • 服务器可以将存储在 Cookie 上的 Session ID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。

    使用 Session 的时候需要注意下面几个点:

    • 依赖Session的关键业务一定要确保客户端开启了Cookie。
    • 注意Session的过期时间

    花了个图简单总结了一下Session认证涉及的一些东西。

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章:

    • Getting Started with Spring Session
    • Guide to Spring Session
    • Sticky Sessions with Spring Session & Redis

    4.如果没有Cookie的话Session还能用吗?这是一道经典的面试题!

    一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID的方案的话, 如果客户端禁用了Cookie,那么Seesion就无法正常工作。

    但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将SessionID放在请求的 url 里面https://javaguide.cn/?session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了你也可以对 SessionID 进行一次加密之后再传入后端。

    5.为什么Cookie 无法防止CSRF攻击,而token可以?

    CSRF(Cross Site Request Forgery)一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?说简单用你的身份去发送一些对你不友好的请求。举个简单的例子:

    小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了10000元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。

    科学理财,年盈利率过万

    上面也提到过,进行Session 认证的时候,我们一般使用 Cookie 来存储 SessionId,当我们登陆后后端生成一个SessionId放在Cookie中返回给客户端,服务端通过Redis或者其他存储工具记录保存着这个Sessionid,客户端登录以后每次请求都会带上这个SessionId,服务端通过这个SessionId来标示你这个人。如果别人通过 cookie拿到了 SessionId 后就可以代替你的身份访问系统了。

    Session 认证中 Cookie 中的 SessionId是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。

    但是,我们使用 token 的话就不会存在这个问题,在我们登录成功获得 token 之后,一般会选择存放在 local storage 中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 token 的,所以这个请求将是非法的。

    需要注意的是不论是 Cookie 还是 token 都无法避免跨站脚本攻击(Cross Site Scripting)XSS。

    “跨站脚本攻击(Cross Site Scripting)缩写为 CSS 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。” XSS中攻击者会用各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本盗用信息比如cookie。

    6. 什么是 Token?什么是 JWT?如何基于Token进行身份验证?我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。

    有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。

    JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。

    下面是 RFC 7519 对 JWT 做的较为正式的定义。

    “JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——JSON Web Token (JWT)” JWT 由 3 部分构成:

    Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。

    Payload(负载):用来存放实际需要传递的数据

    Signature(签名):服务器通过Payload、Header和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

    在基于 Token 进行身份验证的的应用程序中,服务器通过Payload、Header和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:Authorization: Bearer Token。

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    Token Based Authentication flow

    用户向服务器发送用户名和密码用于登陆系统。

    身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。

    用户以后每次向后端发请求都在Header中带上 JWT。

    服务端检查 JWT 并从中获取用户相关信息。

    7 什么是OAuth 2.0?OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而 OAuth 2.0是对 OAuth 1.0 的完全重新设计,OAuth 2.0更快,更容易实现,OAuth 1.0 已经被废弃。详情请见:rfc6749。

    实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 token,使得第三方应用能够通过该令牌获取相关的资源

    OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

    另外,现在OAuth 2.0也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

    微信支付账户相关参数:

    硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    8 什么是 SSO?SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。

    9.SSO与OAuth2.0的区别OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。SSO解决的是一个公司的多个相关的自系统的之间的登陆问题比如京东旗下相关子系统京东金融、京东超市、京东家电等等。

    参考https://medium.com/@sherryhsu/session-vs-token-based-authentication-11a6c5ac45e4

    https://www.varonis.com/blog/what-is-oauth/

    https://tools.ietf.org/html/rfc6749

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yoozai.net",如遇到无法解压的请联系管理员!
    悠哉网 » 硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    悠哉网 WWW.YOOZAI.NET
    悠哉网,用户消费首选的网站,喜欢你就悠哉一下。

    发表评论

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过200元的模板免费一次安装,需提供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-23:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 80027422@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系作者

    发表评论

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过200元的模板免费一次安装,需提供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-23:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 80027422@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系作者
    • 595会员总数(位)
    • 4902资源总数(个)
    • 169本周发布(个)
    • 0 今日发布(个)
    • 183稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情