当前位置: 首页 > 科技观察

9个认证授权常见问题硬核汇总!看看你能回答几个!

时间:2023-03-17 15:31:43 科技观察

大家好,我是导哥!相信很多人对认证授权并没有特别的了解,对Session认证、JWT、Cookie等概念也不了解。因此,我根据自己日常在项目中对这部分学习的实际应用,总结了这8个相关问题,并附上详细的解答(这篇文章发的这么晚的原因)。所有问题如下。在开始查看答案之前,您不妨测试一下自己可以回答多少。ps:其实我之前写JWT相关文章的时候提到过一些问题。看过的朋友,还记得吗?身份验证和授权有什么区别?什么是饼干?Cookie的作用是什么?服务器端如何使用Cookie?Cookie和Session有什么区别?如何使用Session进行认证?如果没有Cookie,Session还能用吗?为什么Cookie不能防止CSRF攻击,而token可以?什么是令牌?什么是智威汤逊?如何基于Token进行认证?什么是OAuth2.0?什么是单点登录?1.认证和授权有什么区别?这是一个大多数人都会混淆的问题。首先从读音上认识这两个名词。很多人会混淆他们的发音,所以我建议你先看看这两个词怎么发音,具体是什么意思。简单地说:身份验证:你是谁。授权:你有权做什么。稍微正式一点(啰嗦)的说法是:认证(authentication)是验证你身份(比如用户名/用户ID和密码)的凭据。通过这个凭证,系统可以知道你就是你,也就是说系统有你。这个用户。因此,Authentication被称为身份/用户验证。授权发生在身份验证之后。授权,大家看意思就应该明白了,主要是控制我们对系统的访问权限。比如一些特定的资源只有特定权限的人才能访问,比如admin,一些对系统资源的操作,比如删除、添加、更新等,只有特定的人才能访问。这两个在我们的系统中一般是一起使用的,目的是保护我们系统的安全。2.什么是cookie?cookie的功能是什么?如何在服务器端使用cookie?2.1什么是cookie?cookie的功能是什么?应用场景不同。维基百科对cookies的定义如下:Cookies是一些网站为了识别用户身份而存储在用户本地终端上的数据(通常是加密的)。简单来说:Cookies是存储在客户端的,一般用来保存用户信息。以下是cookies的一些应用案例:我们将登录的用户信息保存在cookie中,下次您访问该网站时,页面可以自动填写一些基本信息供您登录。除此之外,cookies可以保存用户偏好、主题和其他设置信息。使用cookie保存session或token,在向后端发送请求时带上cookie,以便后端获取session或token。这样就可以记录用户当前的状态,因为HTTP协议是无状态的。Cookie还可用于记录和分析用户行为。举个简单的例子,当你在网上购物时,由于HTTP协议是无状态的,如果服务器想获取你在某个页面的停留状态或者你浏览了哪些商品,常见的实现方式是存储此信息如何在Cookie2.2中使用服务器端的cookie?这部分参考:https://attacomsian.com/blog/cookies-spring-boot。有关如何在SpringBoot中使用cookie的更多信息,您可以查看这篇文章。1)设置cookie返回给客户端@GetMapping("/change-username")publicStringsetCookie(HttpServletResponseresponse){//创建cookieCookiecookie=newCookie("username","Jovan");//设置cookie过期时间cookie.setMaxAge(7*24*60*60);//expiresin7days//添加到响应中response.addCookie(cookie);return"Usernameischanged!";}2)使用Spring框架提供的@CookieValue注解获取特定cookie的值@GetMapping("/")publicStringreadCookie(@CookieValue(value="username",defaultValue="Atta")Stringusername){return"Hey!Myusernameis"+username;}3)读取所有cookie值@GetMapping("/all-cookies")publicStringreadAllCookies(HttpServletRequestrequest){Cookie[]cookies=request.getCookies();if(cookies!=null){returnArrays.stream(cookies).map(c->c.getName()+"="+c.getValue()).collect(Collectors.joining(","));}return"Nocookies";}3.Cookie和Session有什么区别?如何使用Session进行认证?Session的主要作用是通过服务器记录用户的状态。一个典型的场景是购物车。当你想往购物车中添加商品时,系统并不知道是哪个用户操作的,因为HTTP协议是无状态的。服务器为特定用户创建特定的Session后,就可以识别用户并跟踪用户。Cookie数据保存在客户端(浏览器端),Session数据保存在服务器端。相对来说,Session安全性更高。如果一些使用cookies的敏感信息不应该写入cookies,那么最好将cookies信息加密,使用时再去服务器端解密。那么,如何使用Session进行认证呢?很多时候我们使用SessionID来实现特定的用户,而SessionID通常存储在Redis中。例如:用户登录系统成功,然后返回一个带有SessionID的Cookie给客户端。当用户向后端发起请求时,会带上SessionID,以便后端知道你的身份状态。这种认证方式更详细的过程如下:SessionBasedAuthentication流程用户将用户名和密码发送到服务器以登录系统。服务器认证通过后,服务器为用户创建一个Session,并存储Session信息。服务器返回一个SessionID给用户,并写入用户的Cookie中。当用户保持登录状态时,cookie将随每个后续请求一起发送。服务器可以将cookie中存储的SessionID与内存或数据库中存储的Session信息进行比对,从而验证用户的身份,并将用户的当前状态附加到返回给用户客户端的响应信息中。使用Session时需要注意以下几点:依赖Session的关键业务必须保证客户端开启了Cookie。注意Session的过期时间拍个图来简单总结一下Session认证涉及的一些东西。此外,SpringSession提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果你想了解更多,可以查看以下非常好的文章:SpringSession入门指南SpringSessionStickySessionswithSpringSession&Redis4。如果没有cookie,Session还能用吗?这是一道经典的面试题!GeneralSessionID是通过Cookie保存的。如果使用Cookie保存SessionID的方案,如果客户端禁用了Cookie,那么Seesion将无法正常工作。但是,并不是说没有Cookie就不能使用Session。比如可以把SessionID放在请求的URL中https://javaguide.cn/?session_id=xxx。这种方案是可行的,但是安全性和用户体验有所降低。当然对于你来说,你也可以把SessionID加密一次,然后传给后台。5、为什么cookie不能防止CSRF攻击,而token可以?CSRF(CrossSiteRequestForgery)一般翻译为跨站请求伪造。那么什么是跨站请求伪造呢?简单来说就是利用你的身份向你发送一些不友好的请求。举个简单的例子:小庄登录了一家网上银行。他来到网银的帖子区,看到一个帖子下面有个链接,上面写着“科学理财,年利润过万”。小庄好奇的点开了。点开这个链接后,我发现我的账户少了一万元。是这样吗?原来黑客在链接中隐藏了一个请求。这个请求直接用小庄的身份向银行发送转账请求,也就是通过你的cookie向银行发送请求。科学理财,年利润过万。上面说到,在进行session认证的时候,我们一般会使用cookies来存储SessionId。当我们登录的时候,后台会生成一个SessionId放到cookie中返回给客户端。服务端通过Redis或者其他存储工具记录并保存这个SessionId。客户端登录后,每次请求都会带上这个SessionId,服务端用这个SessionId来标记你是一个人。如果别人通过cookie获得了SessionId,他们就可以代替你的身份访问系统。session认证中cookie中的SessionId是由浏览器发送给服务器的。利用这个特性,攻击者可以通过让用户误点击攻击链接来达到攻击效果。但是,如果我们使用代币,这个问题就不存在了。我们成功登录并获取token后,一般会选择存放在本地存储中。然后我们会在前端通过某种方式在每次发送到后端的请求中加上这个token,这样就不会出现CSRF漏洞了。因为,即使有人点击非法链接,向服务器发送请求,这个非法请求也不会携带token,所以这个请求是非法的。需要注意的是,cookies和token都无法避免跨站脚本(CrossSiteScripting)XSS。“CrossSiteScripting缩写为CSS,但这与CascadingStyleSheets(CSS)的首字母缩写容易混淆。因此,有人将CrossSiteScripting缩写为XSS。”在XSS中,攻击者会使用各种方式将恶意代码注入其他用户的页面。您可以通过脚本窃取cookie等信息。6.什么是代币?什么是智威汤逊?如何基于Token进行认证?在上一个问题中,我们讨论了使用Session来识别用户,并给出了几个SpringSession的案例分享。我们知道Session信息需要保存在服务器端。这种方式会带来一些麻烦,比如要求我们保证保存Session信息的服务器的可用性,不适合移动端(依赖Cookies)等等。有没有办法不用自己存储Session信息就可以实现身份验证呢?只需使用令牌!JWT(JSONWebToken)就是这个方法的实现。这样服务器就不需要保存Session数据了,它只需要在客户端保存服务器返回给客户端的Token,提高了可扩展性。JWT本质上是一段经过签名的JSON格式的数据。由于已签名,收件人可以验证其真实性。以下是RFC7519中JWT更正式的定义。“JSONWebToken(JWT)是一种紧凑的、URL安全的方式,用于表示要在两方之间传输的声明。JWT中的声明被编码为JSON对象,用作JSONWeb签名(JWS)结构的有效负载或用作JSONWeb加密(JWE)结构的明文,从而使声明能够进行数字签名或完整性保护使用消息验证码(MAC)和/或加密。——JSONWebToken(JWT)”JWT由3部分组成:Header:描述JWT的元数据。定义了生成签名的算法和Token的类型。有效载荷(load):用于存放实际需要传递的数据。Signature(签名):服务器使用header中指定的签名算法(默认为HMACSHA256)通过Payload、Header和一个key(secret)生成。在一个基于Token进行认证的应用中,服务端通过Payload、Header和一个秘密(secret)创建一个令牌(Token)并将Token发送给客户端,客户端将这个Token保存在cookie或localStorage中,供以后所有请求使用客户制作的将携带此令牌。可以放在cookie里自动发送,但是这个不能跨域,所以最好放在HTTPHeader的Authorization字段:Authorization:BearerToken。基于令牌的身份验证流程用户将用户名和密码发送到服务器以登录系统。身份验证服务响应并返回包含用户身份的签名JWT。每次用户向后端发送请求时,JWT都会包含在Header中。服务器检查JWT并从中获取有关用户的信息。7什么是OAuth2.0?OAuth是一种行业标准的授权协议,主要用于授权第三方应用获取有限的权限。虽然OAuth2.0是对OAuth1.0的完全重新设计,但OAuth2.0更快且更容易实现,OAuth1.0已被放弃。详情参见:rfc6749。其实就是一种授权机制,其最终目的是为第三方应用发行一个时间敏感的token令牌,让第三方应用通过token获取相关资源。OAuth2.0比较常见的场景是第三方登录。当你的网站连接第三方登录时,一般使用OAuth2.0协议。另外,OAuth2.0现在普遍用于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等)。微信支付账号相关参数:8什么是SSO?SSO(SingleSignOn)是指单点登录,是指一个用户登录到多个子系统之一,就有权访问与其相关的其他系统。比如我们登录京东金融后,也成功登录了京东旗下的京东超市、京东家电等子系统。9、SSO与OAuth2.0的区别OAuth是一种行业标准的授权协议,主要用于授权第三方应用获得有限的权限。SSO解决了一个公司的多个关联自系统之间的登录问题,比如京东金融、京东超市、京东家电等都是京东的关联子系统。参考https://medium.com/@sherryhsu/session-vs-token-based-authentication-11a6c5ac45e4https://www.varonis.com/blog/what-is-oauth/https://tools.ietf.org/html/rfc6749