Cookie-parser는 Express의 미들웨어로 쿠키 구문 분석을 구현하는 데 사용되며 공식 스캐폴딩에 내장된 미들웨어 중 하나입니다. 사용법은 매우 간단하지만, 사용 중에 가끔 문제가 발생할 수 있습니다. 이는 일반적으로 Express + 쿠키 파서의 서명 및 확인 메커니즘에 대한 이해 부족으로 인해 발생합니다. 이번 글에서는 주로 Express 쿠키 파서 미들웨어 구현 사례를 소개합니다. 편집자께서 꽤 괜찮다고 생각하셔서 지금부터 공유하고 참고용으로 올려드리겠습니다. 편집자를 따라가서 모두에게 도움이 되기를 바랍니다.
가장 간단한 예에서 cookie-parser의 사용을 살펴보겠습니다. 여기서는 기본 구성이 사용됩니다.
쿠키 설정: Express의 내장 메소드 res.cookie() 를 사용하세요.
쿠키 구문 분석: 쿠키 파서 미들웨어를 사용합니다.
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); app.use(cookieParser()); app.use(function (req, res, next) { console.log(req.cookies.nick); // 第二次访问,输出chyingp next(); }); app.use(function (req, res, next) { res.cookie('nick', 'chyingp'); res.end('ok'); }); app.listen(3000);
현재 시나리오에서 쿠키 파서 미들웨어는 대략 다음과 같이 구현됩니다.
app.use(function (req, res, next) { req.cookies = cookie.parse(req.headers.cookie); next(); });
보안상의 이유로 일반적으로 쿠키에 서명해야 합니다.
예제는 몇 가지 참고 사항과 함께 다음과 같이 다시 작성되었습니다.
cookieParser가 초기화되면 서명 키로 비밀을 전달합니다.
쿠키를 설정할 때 signed를 true로 설정하여 설정하려는 쿠키에 서명하세요.
쿠키를 얻을 때 req.cookies 또는 req.signedCookies를 통해 얻을 수 있습니다.
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 初始化中间件,传入的第一个参数为singed secret app.use(cookieParser('secret')); app.use(function (req, res, next) { console.log(req.cookies.nick); // chyingp console.log(req.signedCookies.nick); // chyingp next(); }); app.use(function (req, res, next) { // 传入第三个参数 {signed: true},表示要对cookie进行摘要计算 res.cookie('nick', 'chyingp', {signed: true}); res.end('ok'); }); app.listen(3000);
서명 전 쿠키 값은 chyingp 이고, 서명 후 쿠키 값은 s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0 이며, 디코딩 후 s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5 입니다. oa 6mppny9d+mG9rD0.
쿠키 서명과 구문 분석이 어떻게 구현되는지 분석해 보겠습니다.
Express는 쿠키 값의 서명을 완성하고, cookie-parser는 서명된 쿠키의 구문 분석을 구현합니다. 둘 다 동일한 비밀 키를 공유합니다.
쿠키 서명
Express의 쿠키 설정(서명 포함)은 모두 res.cookie() 메서드를 통해 구현됩니다.
간략화된 코드는 다음과 같습니다.
res.cookie = function (name, value, options) { var secret = this.req.secret; var signed = opts.signed; // 如果 options.signed 为true,则对cookie进行签名 if (signed) { val = 's:' + sign(val, secret); } this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); return this; };
sign은 서명 기능입니다. 의사 코드는 다음과 같으며 실제로 쿠키의 원래 값과 hmac 뒤의 값을 연결합니다.
칠판에 중요한 점을 표시하겠습니다. 서명된 쿠키 값에는 원래 값이 포함됩니다.
function sign (val, secret) { return val + '.' + hmac(val, secret); }
여기의 비밀은 어디서 오는 걸까요? 쿠키 파서가 초기화될 때 전달됩니다. 다음 의사 코드에 표시된 대로:
var cookieParser = function (secret) { return function (req, res, next) { req.secret = secret; // ... next(); }; }; app.use(cookieParser('secret'));
서명된 쿠키 구문 분석
쿠키 서명 메커니즘을 알고 나면 서명된 쿠키를 "파싱"하는 방법이 분명해집니다. 이 단계에서 미들웨어는 주로 두 가지 작업을 수행합니다.
서명된 쿠키에 해당하는 원래 값을 추출합니다.
서명된 쿠키가 합법적인지 확인합니다.
구현 코드는 다음과 같습니다.
// str:签名后的cookie,比如 "s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0" // secret:秘钥,比如 "secret" function signedCookie(str, secret) { // 检查是否 s: 开头,确保只对签过名的cookie进行解析 if (str.substr(0, 2) !== 's:') { return str; } // 校验签名的值是否合法,如合法,返回true,否则,返回false var val = unsign(str.slice(2), secret); if (val !== false) { return val; } return false; }
Judge 쿠키의 원래 값을 추출합니다. 값은 비교적 간단합니다. 단지 unsign 메소드의 이름이 혼란스러울 뿐입니다.
일반적으로 서명은 법적으로 확인만 되며, 소위 연대서명은 없습니다.
unsign 메소드의 코드는 다음과 같습니다.
먼저, 들어오는 쿠키 값에서 원래 값 A1과 서명 값 B1을 추출합니다.
둘째, 동일한 비밀 키를 사용하여 A1에 서명하여 A2를 얻습니다.
마지막으로 A2와 B1이 동일한지 여부에 따라 서명이 적법한지 여부를 판단합니다.
exports.unsign = function(val, secret){
var str = val.slice(0, val.lastIndexOf('.')) , mac = exports.sign(str, secret); return sha1(mac) == sha1(val) ? str : false; };
은 주로 보안상의 이유로 쿠키가 변조되는 것을 방지하고 보안을 강화하는 것입니다.
쿠키 서명이 어떻게 변조를 방지할 수 있는지 간단한 예를 들어 보겠습니다.
이전 예시를 토대로 확장해 보세요. 웹사이트가 현재 로그인한 사용자가 누구인지 구별하기 위해 닉 쿠키를 사용한다고 가정합니다. 앞선 예에서 로그인한 사용자의 쿠키에서 nick에 해당하는 값은 다음과 같습니다. (디코딩 후)
s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
이때 누군가 수정을 시도했습니다. 가짜 신원 목적을 달성하기 위한 쿠키 값. 예를 들어, 이를 Xiaoming으로 변경합니다:
s:xiaoming.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
웹사이트가 요청을 받으면 서명 쿠키를 구문 분석하여 서명 확인이 실패했음을 확인합니다. 이를 통해 쿠키가 위조된 것으로 판단할 수 있습니다.
hmac("xiaoming", "secret") !== "uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0"
물론 그렇지 않습니다.
이전 섹션의 예에서는 로그인한 사용자를 확인하기 위해 닉 쿠키 값만 사용합니다. 이는 매우 나쁜 디자인입니다. 비밀 키를 알 수 없는 경우 서명된 쿠키를 위조하는 것은 어렵습니다. 그러나 사용자 이름이 동일하면 서명도 동일합니다. 이 경우 실제로 위조가 매우 쉽습니다.
또한, 오픈소스 구성요소의 알고리즘은 공개되어 있으므로 비밀키의 보안이 핵심이 되며, 비밀키가 유출되지 않도록 보장하는 것이 필요합니다.
여기에는 더 많은 내용이 있지만 여기서는 다루지 않겠습니다.
이 기사는 주로 Express + 쿠키 파서의 서명 및 구문 분석 메커니즘에 대해 비교적 심층적으로 소개합니다.
많은 유사한 요약 기사에서 쿠키 서명이 암호화로 설명되어 있습니다. 이는 흔히 발생하는 실수이므로 독자는 이에 주의해야 합니다.
서명 부분에 대한 소개에는 약간의 간단한 보안 지식이 포함되어 있습니다. 이 분야에 익숙하지 않은 학생들도 메시지를 남겨서 소통할 수 있습니다. 설명의 편의를 위해 일부 단락과 표현이 충분히 엄격하지 않을 수 있습니다. 오류나 누락된 부분이 있으면 지적해 주시기 바랍니다.
관련 권장 사항:
node는 express를 구현하여 자체 서버 인스턴스를 구축합니다.
Express.Router 인스턴스를 사용하는 Node.js에 대한 자세한 설명
Express 프레임워크에서 세션을 사용하여 로그인 인증 구현
위 내용은 Express 쿠키 파서 미들웨어에 대한 포괄적인 숙달의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!