이 글은 Express가 세션과 쿠키를 어떻게 사용하는지 주로 소개하고 참고용으로 올려드립니다.
상태 비저장 http
우리 모두는 http 요청과 응답이 서로 독립적이라는 것을 알고 있으며 서버는 두 http 요청이 동일한 사용자에 의해 전송되었는지 여부를 식별할 수 없습니다. 즉, 서버에는 통신 상태를 기록하는 기능이 없습니다. 당사는 일반적으로 세션에서 양 당사자의 신원을 확인하기 위해 쿠키와 세션을 사용합니다.
cookie
쿠키는 서버에서 전송됩니다. 이 식별자는 사용자의 신원을 나타냅니다. 서버는 클라이언트가 보낸 이 식별자를 통해 사용자의 신원을 식별합니다. 그런 다음 사용자의 관련 데이터가 사용자에게 전송됩니다.
express에서 제공하는 쿠키 파서 미들웨어를 설치합니다.
npm i -S cookie-parser
우리가 사용하는 프로젝트 페이지 모듈에 쿠키 파서 플러그인을 도입한 후 다음과 같이 인스턴스화합니다.
var cookieParser = require('cookie-parser'); var cp = cookieParser(secret, options);
두 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 secret입니다. , 이를 사용하여 쿠키에 서명할 수 있으며, 이를 종종 쿠키 암호화라고 부릅니다. 문자열 또는 배열일 수 있습니다. 암호화 원칙에 익숙한 학생은 이 문자열이 서버가 소유한 암호문이라는 것을 알아야 합니다. 두 번째 매개변수 옵션에는 다음과 같은 선택적 매개변수가 포함됩니다.
path: 쿠키 영향 지정 경로
expires: 시간 형식 지정
maxAge: 쿠키가 만료되는 시기 지정
secure: secure 값이 true이면 HTTPS에서만 유효하고, 그렇지 않으면 쿠키는 다음에서 유효합니다. HTTP .
httpOnly: 브라우저는 쿠키를 변경하기 위해 document.cookie를 작동하는 스크립트를 허용하지 않습니다. 이를 true로 설정하면 우리가 signedCookies라고 부르는 공격을 피할 수 있습니다.
구현 코드는 다음과 같습니다.
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // 如果请求中的 cookie 存在 isFirst // 否则,设置 cookie 字段 isFirst, 并设置过期时间为10秒 app.get('/', function(req, res) { if (req.cookies.isFirst) { res.send("再次欢迎访问"); console.log(req.cookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000}); res.send("欢迎第一次访问"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
위 코드에서 우리는 cooke-parser의 첫 번째 매개변수가 서버에서 제공하는 암호화 키를 지정할 수 있다는 것을 알 수 있으며, 그런 다음 서명된 구성을 사용할 수 있습니다. 암호화를 달성하기 위한 옵션 항목입니다. 이는 상대적으로 안전하지만 클라이언트 쿠키에는 제한이 있습니다. 클라이언트가 요청을 보내면 요청 헤더의 데이터 양이 늘어나 요청 속도가 느려지고 데이터 공유가 불가능해집니다.
sessionexpress-session은 세션을 생성하는 데 사용되는 expressjs의 미들웨어입니다. 서버는 session-id를 생성하고, 클라이언트는 쿠키를 이용하여 session-id의 요청 정보를 암호화하여 저장하고, 사용자가 요청한 데이터를 서버에 저장하지만, 사용자의 데이터를 암호화하여 저장할 수도 있습니다. 클라이언트에서.
session은 클라이언트와 서버 간의 세션 상태를 기록하며, 이는 클라이언트의 신원을 확인하는 데 사용됩니다. express-session은 세션 저장 위치를 지원합니다
쿠키, 메모리 또는 redis 및 mongodb와 같은 타사 서버에 저장할 수 있습니다.
세션은 기본적으로 메모리에 저장됩니다. 쿠키에 저장하는 경우 보안이 너무 낮고, Redis가 아닌 데이터베이스에 저장하는 경우 쿼리 속도가 너무 느립니다. 일반적인 프로젝트 개발에서는 Redis(캐시)에 저장됩니다. 데이터 베이스).
express에서 제공하는 express-session 미들웨어 설치 명령을 설치합니다.
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser('my_cookie_secret')); // cookie app.get('/', function(req, res) { if (req.signedCookies.isFirst) { res.send("欢迎再一次访问"); console.log(req.signedCookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000, signed: true}); res.send("欢迎第一次访问"); } });
우리가 사용하는 프로젝트 페이지 모듈에 express-session 플러그인을 도입한 후 다음과 같이 인스턴스화합니다.
npm i -S express-session
주요 매개변수 옵션 구성 항목 of session()에는 다음이 있습니다:
name: 세션의 필드 이름을 저장하도록 쿠키를 설정합니다. 기본값은 connect.sid입니다.
쿠키 세션은 구성 항목의 쿠키 구성 항목을 사용하여 쿠키에 세션 데이터를 저장하고 클라이언트에 데이터를 저장한다는 점에서 서명된 쿠키와 유사합니다. 데이터가 암호화되었지만 암호화된 요청으로 얻은 데이터 구조가 다릅니다.
cooke 세션의 구조는 다음과 같습니다. var session = require('express-session');
var se = session(options);
Session { cookie: { path: '/', _expires: 2018-01-29T17:58:49.950Z, originalMaxAge: 60000, httpOnly: true }, isFirst: 1 }
쿠키 세션을 구현하는 코드는 다음과 같습니다.
{ isFirst: '1' }
signedCookies 정보는 보이지만 수정할 수 없으며, 쿠키 세션도 볼 수 없습니다. 또한 수정할 수 없습니다
针对Cooke session增加了客户端请求的数据规模,我们一般这样使用,数据库存储session。
数据库保存session
用数据库保存session,我们一般使用redis,因为它是缓存数据库,查询速度相较于非缓存的速度更快。
express-session 的实例代码如下:
var path = require('path'); var express = require('express'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); // route app.get('/', function(req, res) { if (req.session.isFirst) { res.send("欢迎再一次访问。"); console.log(req.session) } else { req.session.isFirst = 1; res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
但有时我们也使用非redis数据库保存session,这时我们就需要对项目结构有深刻的认识和理解;否则,使用后反而会适得其反。
另外,我们要注意使用数据库保存session数据,在浏览器端的session-id会随着浏览器的关闭而消失,下次打开浏览器发送请求时,服务器依然不能识别请求者的身份。
cookie session 虽然能解决这个问题,但是它本身存在着安全风险,其实cookie session 和 signedCookies都面临xss攻击。
其实,使用signedCookies和session的结合会在一定程度上降低这样的风险。
signedCookies(cookies) 和 session的结合
在开发中,我们往往需要signedCookies的长期保存特性,又需要session的不可见不可修改的特性。
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, // cookie: { maxAge: 60 * 1000, httpOnly: true }, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); app.get('/', function(req, res, next) { if(req.session.isFirst || req.cookies.isFirst) { res.send("欢迎再一次访问"); } else { req.session.isFirst = 1; res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true}); res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
这样我们将session保存在redis中的信息,保存在了session_id所标示的客户端cooke中一份,这样我们就不用担心,浏览器关闭,cookie中的session_id字段就会消失的情况,因为浏览器中还有它的备份cookie,如果没有备份的cookie信息,下次客户端再次发出请求浏览就无法确定用户的身份。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
在vue+iview+less+echarts中实战项目(详细教程)
위 내용은 Express에서 세션 및 쿠키 메소드를 사용하는 방법(자세한 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!