这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,不少人都会把它俩的读音搞混,因此我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。html
说简单点就是:git
稍微正式点(啰嗦点)的说法就是:github
这两个通常在咱们的系统中被结合在一块儿使用,目的就是为了保护咱们系统的安全性。web
Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,可是二者的应用场景不太同样。redis
维基百科是这样定义 Cookie 的:Cookies是某些网站为了辨别用户身份而储存在用户本地终端上的数据(一般通过加密)。简单来讲: Cookie 存放在客户端,通常用来保存用户信息。算法
下面是 Cookie 的一些应用案例:spring
这部份内容参考:https://attacomsian.com/blog/cookies-spring-boot,更多如何在Spring Boot中使用Cookie 的内容能够查看这篇文章。数据库
1)设置cookie返回给客户端json
@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!"; }
2) 使用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 != null) { return Arrays.stream(cookies) .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", ")); } return "No cookies"; }
Session 的主要做用就是经过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪一个用户操做的,由于 HTTP 协议是无状态的。服务端给特定的用户建立特定的 Session 以后就能够标识这个用户而且跟踪这个用户了。
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来讲 Session 安全性更高。若是使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密而后使用到的时候再去服务器端解密。
那么,如何使用Session进行身份验证?
不少时候咱们都是经过 SessionID 来实现特定的用户,SessionID 通常会选择存放在 Redis 中。举个例子:用户成功登录系统,而后返回给客户端具备 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程以下:
另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。若是想详细了解能够查看下面几篇很不错的文章:
咱们在上一个问题中探讨了使用 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 部分构成:
Payload
、Header
和一个密钥(secret
)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。在基于 Token 进行身份验证的的应用程序中,服务器经过Payload
、Header
和一个密钥(secret
)建立令牌(Token
)并将 Token
发送给客户端,客户端将 Token
保存在 Cookie 或者 localStorage 里面,之后客户端发出的全部请求都会携带这个令牌。你能够把它放在 Cookie 里面自动发送,可是这样不能跨域,因此更好的作法是放在 HTTP Header 的 Authorization字段中: Authorization: Bearer Token
。
推荐阅读:
OAuth 是一个行业的标准受权协议,主要用来受权第三方应用获取有限的权限。而 OAuth 2.0是对 OAuth 1.0 的彻底从新设计,OAuth 2.0更快,更容易实现,OAuth 1.0 已经被废弃。详情请见:rfc6749。
实际上它就是一种受权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 token,使得第三方应用可以经过该令牌获取相关的资源。
OAuth 2.0 比较经常使用的场景就是第三方登陆,当你的网站接入了第三方登陆的时候通常就是使用的 OAuth 2.0 协议。
推荐阅读: