http是一种无状态的协议,每一个请求都是独立的,即使同一个页面向服务器发送多次请求,服务器也无法区分是不是同一用户,所以这个时候可以借助于cookie来做身份认证,当用户登录成功,服务器为浏览器设置cookie,而在后面的请求当中,浏览器发送请求的时候,就会携带cookie,需注意的是,cookie需要同源的请求下才会发送。
 
设置cookie的时候还有以下值属性可以进行选择,分别是过期时间和作用域,没有设置过期时间,cookie的生命周期仅为会话阶段,关闭浏览器即被删除,通过max-age或者expires设置,cookie的生命周期为有效期内,超出有效期则被删除,作用域可设置domain和path,domain代表指定哪些主机可以接收cookie,没有设置的时候默认origin,仅当前域名有效,设置后当前域名和子域名都可用,path用于指定主机下哪个路径可以接受cookie。
 
 
浏览器端通过 document.cookie 来获取和设置cookie,当需要在浏览器使cookie失效,则可以设置 max-age=0
document.cookie = 'name=alice;max-age=5' // max-age在浏览器端的单位为秒
 
在服务器端,通过nodejs中http模块设置响应头信息setCookie,第二次请求则会在请求头中携带cookie,如果对nodejs不太熟悉,可以参考这一篇文章,nodejs中如何使用http创建一个服务
const http = require('http')

const server = http.createServer((req, res) => {
res.setHeader('Set-Cookie', ['age=16;max-age=20000']) // max-age在nodejs的单位为毫秒
res.end('cookie')
})
 
koa中通过 ctx.cookies.set和ctx.cookies.get来分别设置和获取cookie,以下代码表示,当访问 localhost:7000/login的时候,服务器为浏览器设置一个 cookie,当访问 localhost:7000/user的时候,服务器获取浏览器的cookie。如果对koa还不太熟悉,可以参考这一篇文章,让nodejs开启服务更简单--koa篇 
const Koa = require('koa')
const app = new Koa() const Router = require('koa-router')
const router = new Router() router.get('/login', (ctx, next) => {
ctx.cookies.set('wheater', 'sunny', {
maxAge: 60*1000
})
ctx.body = 'set cookie'
}) router.get('/user', (ctx, next) => {
const cookie = ctx.cookies.get('wheater')
ctx.body = cookie
}) app.use(router.routes())
app.use(router.allowedMethods()) app.listen(7000, ()=>{console.log('开启服务')})

使用nodejs中的http模块对请求进行响应需要自己处理复杂逻辑,通过 koa 可以简化很多操作,比如koa就自动加上了 HttpOnly的属性

 
以上存储在cookie中的数据都是以明文的形式,非常的不安全,真正在实际应用时,需要将用户信息进行加密处理,这时候可以考虑使用 session,session也是给浏览器填充cookie值,但它可以为填充的cookie进行加密处理
const Koa = require('koa')
const Router = require('koa-router')
const Session = require('koa-session') const app = new Koa()
const router = new Router() // signed: true 增加一个sessionid的签名文件 sessionid.sig
const session = Session({
key: 'sessionId',
maxAge: 60 * 1000,
signed: true
}, app)
app.keys = ['alice']
app.use(session) router.get('/login', (ctx, next) => {
const id = 1;
const name = 'lucy'
ctx.session.user = { id, name }
ctx.body = 'set session'
}) router.get('/user', (ctx, next) => {
ctx.body = ctx.session.user // { id: 1, name: 'lucy'}
}) app.use(router.routes())
app.use(router.allowedMethods()) app.listen(7000, () => { console.log('开启服务') })

session以base64编码的形式进行存储,可以被解码,也并不完全安全,所以通过 signed: true 设置密钥,使增加一个加密后的 sessionid.sig,这样服务器在获取cookie中设置的session数据就会对数据的真实性进行校验

 
以上cookie和session可以用于身份校验,但这种方式存在以下问题:
1、cookie在每个请求的时候都会被携带,无形之中增加了带宽
2、cookie只有4kb的容量,对于复杂需求可能不够用
3、在浏览器外的其他客户端,cookie并不会主动携带,需要手动设置cookie和session,所以不同端在处理cookie上存在差异
4、 对于分布式系统和服务器集群中如何可以保证其他系统也可以正确的解析session也存在问题,像java中每台服务器获取session的密钥都不一样
 
基于以上问题,目前越来越多的开发者会使用 token 来进行身份校验,下一篇文章中仔细介绍 token 如何做到身份校验~

如何通过cookie、session鉴权(nodejs/koa)的更多相关文章

  1. SpringBoot系列: Web应用鉴权思路

    ==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...

  2. 5、 postman的鉴权

    什么是鉴权? 鉴权(authentication)是指验证用户是否拥有访问系统的权利.常用的有两种鉴权方式,一种是session鉴权,一种是jwt鉴权,相对而言,后者居多. 实例: 比如有一个添加角色 ...

  3. Session, Token, OAuth 鉴权那些事儿

    鉴权那些事 整体思路 无论什么样的服务, Web 服务总是不能绕开鉴权这个话题的, 通过有效的鉴权手段来保护网站数据, 来为特定用户提供服务. 整体来说, 有三种方式: Session-Cookie ...

  4. Cookie、Session、JWT在koa中的应用及实现原理

    目录 Cookie 重要属性 实现原理 cookie签名实现原理 注意事项 Session 实现原理 JWT 使用方式 组成 实际应用 实现原理 前端存储方式 cookie session local ...

  5. WebAPI常见的鉴权方法,及其适用范围

    在谈这个问题之前,我们先来说说在WebAPI中保障接口请求合法性的常见办法: API Key + API Secret cookie-session认证 OAuth JWT 当然还有很多其它的,比如 ...

  6. cookie, session, token 是什么 以及相应的安全考量

    Cookie cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面 cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果 ...

  7. shiro jwt 构建无状态分布式鉴权体系

    一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...

  8. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  9. Tomcat 容器的安全认证和鉴权

    大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制: ...

  10. Django基于JWT实现微信小程序的登录和鉴权

    什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...

随机推荐

  1. 联想win8改win7

    知识点分析:目前联想出厂预装Windows 8的台式和一体机使用都是UEFI+GPT硬盘的组合,并且开启了安全启动,但是目前除Window 8以外的其他Windows系统均不支持这种模式,因此如果需要 ...

  2. npm i 与 npm install 的区别

    我们在平时运用的时候一般用 npm i 来代替 npm install(为npm i 的简写) 但是在实际应用中两者是有些不同的(查阅总结): 1.使用npm i 安装的模块和依赖,使用npm uni ...

  3. 文心一言 VS chatgpt (11)-- 算法导论2.3 7题 3.1 4~5题

    四.2 ^ (n+1)=O(2 ^ n)成立吗? 2^(2n)=O(2 ^ n)成立吗? 文心一言: chatgpt: 第一个式子不成立,第二个式子成立. 2 ^ (n+1) = O(2 ^ n) 该 ...

  4. 2022-01-23:力扣425,单词方块。 给定一个单词集合 (没有重复),找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < m

    2022-01-23:力扣425,单词方块. 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...

  5. APP调用第三方(微信)登录(最详细的实现流程)

    最近使用weexplus做了个app 用户需要的是可以使用第三方微信实现登录(虽然网上有很多相关的什么申请开发者账户.appid.openid等资料:但是都是讲的中间的那一部分请原谅我是个菜鸟,脑补开 ...

  6. 代码随想录算法训练营Day8字符串|●  344.反转字符串  541. 反转字符串II  剑指Offer 05.替换空格  151.翻转字符串里的单词  剑指Offer58-II.左旋转字符串

    344.反转字符串 题目连接:344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,__你必须原地修改输入数组.使用 ...

  7. 通过实例了解vue3.3更新的特征

    开场白 5月份,vue团队发布了 vue3.3. 这次小版本的发布主要解决了-- Vue 与 TypeScript 一起使用时的许多长期存在的痛点. 下面我们一起来学习一下vue3.3新特征 准备新新 ...

  8. 手把手实践丨基于STM32+华为云设计的智慧烟感系统

    摘要:当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析. 本文分享自华为云社区<基于STM32+华为云设计的智慧烟感系统> ...

  9. 归并排序Java版(图文并茂思路分析)

    归并排序 工作原理: 工作原理是将一个大问题分解成小问题,再将小问题分解成更小的.(乍一看就觉得是像一个递归)就像下图这样.然后不断的将其一份为二,分解成更小的排序. 我们设一个函数叫MergeSor ...

  10. Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式

    目录 <Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式> 引言 大数据时代已经来临,随着互联网和物联网的普及,海量数据的产生和存储已经成为一种普遍的现象. ...