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. 音视频八股文(10)-- mp4结构

    介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 .它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流.海报.字幕和元数据等.(顺便⼀提,⽬前流⾏的视频编码格 ...

  2. ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

    通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下: baseURL:请求前缀 timeout:超时时间 headers:请求头 默认配置: im ...

  3. 联想win8改win7

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

  4. 2022-08-19:以下go语言代码输出什么?A:equal;B:not equal;C:不确定。 package main import ( “fmt“ “reflect“ )

    2022-08-19:以下go语言代码输出什么?A:equal:B:not equal:C:不确定. package main import ( "fmt" "refle ...

  5. 2021-12-02:给定一个字符串str,和一个正数k。 返回长度为k的所有子序列中,字典序最大的子序列。 来自腾讯。

    2021-12-02:给定一个字符串str,和一个正数k. 返回长度为k的所有子序列中,字典序最大的子序列. 来自腾讯. 答案2021-12-02: 单调栈.先进来的元素大,后进来的元素小. 时间复杂 ...

  6. 2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。

    2021-09-03:直线上最多的点数.给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点.求最多有多少个点在同一条直线上.力扣149. 福大大 ...

  7. MySQL的varchar存储原理:InnoDB记录存储结构

    摘要:varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实 ...

  8. PHP中的AMQP类

    PHP中的AMQP类 标签(空格分隔): php,amqp 官网地址:http://docs.php.net/manual/da/book.amqp.php AMQPConnection AMQPCo ...

  9. 【lwip】14-TCP协议分析之TCP协议之可靠传输的实现(TCP干货)

    lwip_14_TCP协议之可靠传输的实现 前言 ‍ 前面章节太长了,不得不分开. 这里已源码为主,默认读者已知晓概念或原理,概念或原理可以参考前面章节,有分析. 参考:李柱明博客:https://w ...

  10. 第四章 IDEA的安装与使用

    网上一大推的教程 ‍