认证和授权

认证和授权

1.认证(Authentication)和授权(Authorization)的区别是什么?

说简单点就是:

认证(Authentiation):你是谁?

是验证你身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道是你,也就是说系统存在你这个用户。所以,Authentication被称为身份/用户验证。

授权(Authorization):你在干什么?

发生在Authentication之后,它主要掌管我们访问系统的权限,比如有些特定资源只能具有特定权限的人才能访问admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。

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

2.什么是Cookie?Cookie的作用是什么?

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

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

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

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

如何在服务端使用cookie呢?

(1)设置cookie返回给客户端。

@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {
// 创建⼀个 cookie
Cookie cookie = new Cookie("username", "Jovan");
//设置 cookie过期时间
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
//添加到 response 中
response.addCookie(cookie);
return "Username is changed!"; }

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

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

(3)读取所有的Cookie值

@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies êX null) {
return Arrays.stream(cookies)
 .map(c i> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));
 }
return "No cookies"; }

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

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

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

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

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

整个流程为:

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

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

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

4.如果没有Cookie的话Session还能用吗?

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

但是,并不是没有Cookie之后就不能用Session了,比如你可以将请求的SessionID放在请求的url里面https://XXXXX/?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 进行身份验证?

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

JWT由3部分构成:

  1. Header:描述JWT的元数据,定义了生成签名的算法以及Token类型。
  2. Payload(负载):用来存放实际需要的数据;
  3. Signature(签名):服务器通过payload、Header和一个密钥(secret)使用Header里面指定的签名算法(默认是HMAC SHA256)生成。

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

整个流程为:

  1. 用户向服务器发送用户名和密码用于登陆系统;
  2. 身份验证服务响应并返回了签名的JWT,上面包含了用户是谁的内容。
  3. 用户以后每次向后端请求都在Header中带上JWT;
  4. 服务端检查JWT并从中获取用户相关信息。

7.什么是OAuth2.0

OAuth是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而Aouth2.0是对OAuth1.0的完全重新设计,OAuth2.0更快,更容易实现,OAuth1.0已经被废弃。

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

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

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

8.什么是SSO?

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

9.SSO与OAuth2.0的区别

OAuth是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。SSO解决的是一个公司的多个相关的子系统之间的登陆问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值