前后端分离很多接口会暴露在公网上,为了防止用户直接请求,或者被别有用心的人使用通常开发者会为登录后的用户签发一个token,客户端在发起请求的时候携带,后台确认请求者的身份判断是否执行
HTTP 协议 Web 浏览器与 Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是 HTTP 协议。 HTTP 是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议之上的一个应用层的协议,用于定义 Web 浏览器与 Web 服务器之间交互数据的过程以及数据本身的格式。 特点:无状态,默认端口 80 HTTP 协议到底约束了什么? 约束了浏览器以何种格式向服务端发送数据 约束了服务器应该以何种格式来接收客户端发送的数据 约
但是要明白,JWT 和 Cookie-Session 只是对授权信息存储的主体(客户端,服务端)不同,各有优势,合适场景不同,不存在谁比谁要先进的问题。 cookie-session 总所周知,因为 HTTP 是无状态协议,所以 Cookie-Session 的原理其实很简单,就是解决 HTTP 协议无状态的问题,在 RFC 6265 中定义了 HTTP 总结 cookie-session 的方案在存储授权信息具有以下优势: 安全性:由于状态信息都存储在服务端,cookie-session 方案在安全性上有天然的优势,能完全规避上下文信息在传输过程中被篡改的风险 Cookie-Session 在单体服务环境中是最合适的方案,但是因为服务端有状态,当需要水平扩展服务能力,要部署集群时就开始面临麻烦了。 接下来的 JWT 令牌就是 Cookie-Session 在分布式环境的替代品,但是不能说 JWT 要比 Cookie-Session 更加先进,更不可能全面取代 Cookie-Session 机制。
三,cookie-session 1,cookie HTTP协议是无连接,无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); next(); }); cookie-session // 引入cookie-session模块(yarn add cookie-session 或 npm i cookie-session 安装) const cookieSession = require ("cookie-session"); // 为cookieSession设置属性 app.use( cookieSession({ // 建立cookie的名字 name: "JDCJ
i最传统的就要是Cookie-Session这种方式了,最早的登录方式都是这样实现的。 Cookie-Session机制是通用的,所有的浏览器都支持Cookie,就连最低端的IE都支持,你说他普遍不普遍。 Cookie-Session的由来给大家说完了,我们看看基于Cookie这种方式的登录流程, ? 基于Cookie-Session机制的登录实现方式的整体流程就是这个样子。看上去很完美,但还是存在不少问题的,我们来看看这些问题。 那么它与Cookie-Session的区别是什么呢? 登录状态、用户id并没有存储到session,而是存在JWT的payload里,返回给了前端。
使用的是express框架,里面用到了两个相关的模块:cors跨域和express的cookie-session模块,导包如下: const cors = require('cors'); const cookieSession = require('cookie-session'); 然后配置了响应的中间件 app.use(cors()); // 设置cookie中间件 app.use(cookieSession keys: ['zhangsan', 'shuai'], //加密用的加盐技术 maxAge: 24 * 60 * 60 * 1000 //过期的时间:24小时后过期 })) 然后将用户名和密码按照cookie-session
随着近几年来RESTful API开始流行,用HTTP header来传递认证令牌似乎变得理所应当,而对于单页应用(SPA)、前后端分离的架构似乎也正在促成WEB应用放弃拥有悠久历史的cookie-session 支持此方案的人们认为: 1.该方案更易于水平扩展 在cookie-session方案中,客户端cookie中仅包含一个session标识符,而诸如用户信息、授权列表等都保存在服务端的session中。 除非你的应用访问量非常非常非常大,使用cookie-session配合外部session存储完全够用了。 2.该方案可避免CSRF攻击 跨站请求伪造Cross-site request forgery(CSRF)是一种典型的利用cookie-session漏洞的攻击。 如果JWT中如果保存了敏感的信息,相对于cookie-session将数据存储在服务端来说,更不安全。 除了以上的误解外,使用JWT代替cookie-session还有如下缺点: 更多的空间占用。
i最传统的就要是Cookie-Session这种方式了,最早的登录方式都是这样实现的。 但是随着手机端、H5端的兴起,前后端分离的模式越来越流行,基于Cookie-Session这种登录方式不是很方便,渐渐的JTW开始流行,现在大部分项目的登录方式都是基于JWT的了。 Cookie-Session机制是通用的,所有的浏览器都支持Cookie,就连最低端的IE都支持,你说他普遍不普遍。 基于Cookie-Session机制的登录实现方式的整体流程就是这个样子。看上去很完美,但还是存在不少问题的,我们来看看这些问题。 那么它与Cookie-Session的区别是什么呢? 登录状态、用户id并没有存储到session,而是存在JWT的payload里,返回给了前端。
session数据保存在服务器端 2、session是以键和值的形式进行存储 3、session依赖于cookie,每个session信息对应的客户端的标识保存在cookie中 使用: 先安装和引入:cookie-session const cookieSession = require('cookie-session'); 注册到app中: app.use(cookieSession({ name:"my_session req.session["name"] = "session_node" 获取session:let name = req.session["name"] 完整代码如下: // 1、先安装:yarn add cookie-session 如果报错,后面添加版本号,然后一直回车就好 yarn add cookie-session@2.0.0 // 2、设置到app中 const cookieSession = require('cookie-session
true,//服务器操作 secure:true,//安全cookie signed:true//签名cookie }) }) 5.session cnpm i cookie-session const cookieSession = require(‘cookie-session’); server.use(cookieSession({ keys:[ ‘abcabac’, ‘effe’
早期的 Cookie-Session 认证方式 早期互联网以 web 为主,客户端是浏览器 ,所以 Cookie-Session 方式是早期最常用的认证方式,直到现在,一些 web 网站依然用这种方式做认证 在这种潮流之下,传统的 Cookie-Session 就遇到了一些问题: 1、首先,Cookie-Session 只能在 web 场景下使用,如果是 APP 呢,APP 可没有地方存 cookie。 Cookie-Session 改造版 由于传统的 Cookie-Session 认证存在诸多问题,那可以把上面的方案改造一下。 经过一顿猛如虎的改造,解决了传统 Cookie-Session 方式存在的问题。这种改造需要开发者在项目中自行完成。改造起来肯定是费时费力的,而且还有可能存在漏洞。 JWT 出场 这时,JWT 就可以上场了,JWT 就是一种Cookie-Session改造版的具体实现,让你省去自己造轮子的时间,JWT 还有个好处,那就是你可以不用在服务端存储认证信息(比如 token
code 向微信授权服务器发送请求,获取 access_token,也就是上面说的令牌; 之后应用服务器用上一步获取的 access_token 去请求微信授权服务器获取用户的基本信息,例如头像、昵称等; Cookie-Session 认证 早期互联网以 web 为主,客户端是浏览器,所以 Cookie-Session 方式最那时候最常用的方式,直到现在,一些 web 网站依然用这种方式做认证。 的情况下就不能用了; 即使能在 web 场景下使用,也要考虑跨域问题,因为 cookie 不能跨域; cookie 存在 CSRF(跨站请求伪造)的风险; 如果是分布式服务,需要考虑 Session 同步问题; Cookie-Session 改造版 由于传统的 Cookie-Session 认证存在诸多问题,可以把上面的方案改造一下。
1.3 Cookie-Session鉴权 Cookie来源于服务器,存储在浏览器,在某个网址上设置Cookie也很简单。 使用Cookie-Session鉴权也有一个痛点:跨越使用起来麻烦!下面南哥会说说哪一种鉴权没有跨越的烦恼。 (1)上文南哥有提到Cookie-Session鉴权跨越使用起来麻烦,Token就没跨越的麻烦,没错简简单单没烦恼。 (2)令牌是无状态的,服务器不需要像Cookie-Session鉴权一样维护会话状态,服务器只需要验证Token的真实性即可。
在 Web 应用程序中,Cookie-Session 是一种标准的身份验证方法。饼干,也被称为“sweet cookies”。类型为“小文本文件”,是指一些网站为了识别用户身份而存储在客户端的数据。 我们看一下Cookie-Session的认证过程:这是一个典型的 HTTP 客户端(浏览器)和 HTTP 服务器对话,服务器运行在同一台计算机(本地主机)上,包含以下步骤。 下面我将使用Koa来介绍Cookie-Session的认证过程。首先我们来定义首页的路由:// router.js路由器。 listen (port, function ( ) { console . log ( `服务器运行在 http://localhost: ${port} ` );});Cookie-Session的认证过程已经介绍过了
Cookie-Session VS JWT JWT和session有所不同,session需要在服务器端生成,服务器保存session,只返回给客户端sessionid,客户端下次请求时带上sessionid 如果有客户端凭此凭证发出请求,则在服务端存储的信息中,取出用户相关登录信息, 并且使用服务端返回的凭证常存储于Cookie中,也可以改写URL,将id放在url中,这个访问凭证一般来说就是SessionID, 5.3 cookie-session 服务器端会向客户端返回带有sessionID的cookie 在接下来的请求中,服务器将把sessionID与数据库中的相匹配,如果有效则处理该请求 如果用户登出app,session会在客户端和服务器端都被销毁 5.4 Cookie-session 和 JWT 使用场景 后端渲染HTML页面建议使用Cookie-session认证 后按渲染页面可以很方便的写入/清除cookie到浏览器,权限控制非常方便.很少需要要考虑跨域AJAX认证的问题.
localstorage 后端种: 服务器给浏览器种cookie: cookie-parser,只种cookie,不留session 服务器给浏览器种cookie的同时在服务器上生成seesion: cookie-session cookie-session // 安装并引入cookie-session const cookieSession = require('cookie-session'); // 配置中间件
这种机制被称作Cookie-Session机制。 近几年,随着前后端分离的流行,我们的项目结构也发生了变化,如下图: ? 上面的Cookie-Session机制还适不适用? 这里又分两种情况,服务A和服务B在同一域下,服务A和服务B在不同域下。在详细介绍之前,我们先普及一下浏览器的同源策略。 总结 前后端分离,基于Cookie-Session机制的登录总结如下 前后端同域——与普通登录没有区别 前后端不同域 JSONP方式实现 CORS方式实现
这种机制被称作Cookie-Session机制。 上面的Cookie-Session机制还适不适用? 这里又分两种情况,服务A和服务B在同一域下,服务A和服务B在不同域下。在详细介绍之前,我们先普及一下浏览器的同源策略。 总结 前后端分离,基于Cookie-Session机制的登录总结如下 前后端同域——与普通登录没有区别 前后端不同域 JSONP方式实现 CORS方式实现
cookie-session 上面一直提到 session 可以存在 cookie 中,现在来讲讲具体的思路。这里所涉及的专业名词叫做 对称加密。 signedCookies 跟 cookie-session 还是有区别的: 1)是前者信息可见不可篡改,后者不可见也不可篡改 2)是前者一般是长期保存,而后者是 session cookie cookie-session 不过 cookie-session 我个人建议不要使用,有受到回放攻击的危险。