session,cookie,JWT,Token连问

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

img

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

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

简单来说: 由服务端产生,通过回应Cookie 存放在客户端,请求会携带cookie,由服务端验证用户身份

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

  • 登陆验证

我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。

  • 存放session和token,通过session记录用户当前的状态

使用Cookie 保存 session 或者 token ,向后端发送请求的时候带上 Cookie,这样后端就能取到session或者token了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。

  • 存放用户的行为信息

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

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

  • 存放的位置不同,cookie在浏览器,session在服务端

  • 作用不同

    • cookie做为登陆验证,和存放sessionID的工具
    • session主要是通过服务端记录用户的状态。例如购物车
  • 安全性不同

    • session在服务端,更安全
    • cookie在浏览器,不太安全。注意敏感字段不要放入cookie

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

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

  • 服务端生成SessionID,发送给用户浏览器的cookie

  • 用户浏览器发送时, 服务端得到SessionID。对比,取出用户的状态信息

  • 发送给浏览器用户的状态信息

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

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

  • 一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID的方案的话, 如果客户端禁用了Cookie,那么Seesion就无法正常工作。
  • 如果禁用了,可以使用将SessionID 放入url中。安全性降低。也可以双方加密后,通信。

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

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

为什么Cookie 无法防止CSRF攻击的原因

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

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

为什么token可以防止CSRF:

  • token放入浏览器的 local storage 。
  • 通过前端让发送请求上加入token, 这样就可以验证正确的身份。
  • 如果点击了非法的链接,发送的请求也不会带上token。

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

跨站脚本攻击(Cross Site Scripting)缩写为 CSS 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。

XSS中攻击者会用各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本盗用信息比如cookie。

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

我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(有一些低端的手机浏览器不支持 cookie)等等。

有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现。

它的特点是:

  • 服务器端就不需要保存 Session 数据了(用户状态数据,像购物车数据)
  • 状态数据保存在客户端上。
  • JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的(加密的),因此接收者便可以验证它的真实性。

JWT 由 3 部分构成:

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

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

Token Based Authentication flow

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

推荐阅读:

7 什么是OAuth 2.0?

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

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

需求是: 第三方A网站想访问B网站。

  • A 网站提供一个链接,用户点击后就会跳转到 B 网站,授权用户数据给 A 网站使用。
  • 用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码
  • A网站拿着授权码之后,会去向B网站申请令牌(密码)
  • B返回给A网站令牌。

img

推荐阅读:

8 什么是 SSO?

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

9.SSO与OAuth2.0的区别

SSO解决的是一个公司的多个相关的自系统的之间的登陆问题比如京东旗下相关子系统京东金融、京东超市、京东家电等等。

参考盖哥