Java系统设计

一.认证和授权

认证:简单来说认证就是对用户信息(用户名和密码)的校验

授权:发生在用户认证之后,掌管我们访问系统的权限,比如说某些特定的资源只有特定权限的人能够访问比如admin,授权之后才能增,删,改,查的操作。

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

Cookie是用来跟踪浏览器用户身份的会话方式,也可以说用来跟踪用户的状态,cookie中存放了用户的信息,它可运用在这几个方面:

1.平时我们登录账号记住密码之后下次登录可以自动登录,因为第一次登录保存了用户信息。

2.Cookie可保存Session和Token,比起直接将Cookie存在客户端安全,客户端发送携带Session或Token的Cookie之后对于Session可以存放在服务器,然后返回一个sessionid给客户端;对于Token则会在服务器生成一个JWT和一个密钥然后返回给客户端,但是不会储存在服务器。

3.Cookie还可用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为HTTP 协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,⼀种常用的实现方式就是将这些信息存放在Cookie。

三.Cookie和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上的Session ID 与存储在内存中或者数据库中的Session信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。

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

⼀般是通过Cookie来保存SessionID ,假如你使用了Cookie保存SessionID的方案的话, 如果客户端禁用了Cookie,那么Seesion就无法正常工作。 但是,并不是没有Cookie之后就不能用Session 了,比如你可以将SessionID放在请求的url里面https://lzm.cn/?session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,你也可以对 SessionID 进行一次加密之后再传入后端。

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

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

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

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

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

七.什么是Token?什么是JWT?如何基于Token进行身份验证?

前面讲述了两种身份验证的方式:Cookie直接存放用户信息;Session生成sessionid存放在Cookie。第一种方式显然不安全,第二中方式使用Session,虽然安全,但是它存放在服务端,随着时间越长服务器的压力越大,有没有一种方法解决上述的问题呢?答案就是使用Token。这种方式是通过JWT实现的,使用这种方式不需要把session存在服务器,只需要客户端存放服务器返回的Token。JWT 本质上就⼀段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它 的真实性

八.JWT组成

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 并从中获取用户相关信息。 

九.什么是OAuth2.0?

OAuth 2.0实际上它就是⼀种授权机制,它的最终目的是为第三方应用颁发⼀个有时效性的令牌 token,使得第三方应⽤能够通过该令牌获取相关的资源,OAuth 2.0比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的OAuth 2.0协议

OAuth 2.0 的一个简单解释

10 分钟理解什么是 OAuth 2.0 协议

OAuth 2.0 的四种方式 - 阮一峰的网络日志 (ruanyifeng.com)

GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志 (ruanyifeng.com)

十.什么是 SSO?

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

十一.SSO与OAuth2.0的区别?

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#HashMap#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值