Node.js
Node.js 애플리케이션 보안
수색…
교차 사이트 요청 위조 방지 (CSRF)
CSRF 는 최종 사용자가 현재 인증 된 웹 응용 프로그램에서 원치 않는 작업을 강제로 수행하는 공격입니다.
웹 사이트에 대한 모든 요청과 함께 쿠키가 전송되므로 다른 사이트에서 요청한 경우에도 쿠키가 전송 될 수 있습니다.
csurf
모듈을 사용하여 csrf 토큰을 만들고 유효성을 검사 할 수 있습니다.
예
var express = require('express')
var cookieParser = require('cookie-parser') //for cookie parsing
var csrf = require('csurf') //csrf module
var bodyParser = require('body-parser') //for body parsing
// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
// create express app
var app = express()
// parse cookies
app.use(cookieParser())
app.get('/form', csrfProtection, function(req, res) {
// generate and pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed')
})
따라서 GET /form
액세스하면 csrf 토큰 csrfToken
이보기로 전달됩니다.
이제 뷰 내부에서 csrfToken 값을 _csrf
라는 숨겨진 입력 필드의 값으로 설정합니다.
예 : handlebar
템플릿
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>
예를 들면 jade
form(action="/process" method="post")
input(type="hidden", name="_csrf", value=csrfToken)
span Name:
input(type="text", name="name", required=true)
br
input(type="submit")
예 : ejs
템플릿
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>
Node.js의 SSL / TLS
Node.js 응용 프로그램에서 SSL / TLS를 처리하도록 선택하는 경우이 시점에서 SSL / TLS 공격 방지를 유지해야 할 책임이 있습니다. 많은 서버 - 클라이언트 아키텍처에서 SSL / TLS는 역방향 프록시에서 종료되므로 애플리케이션 복잡성을 줄이고 보안 구성의 범위를 줄입니다.
Node.js 응용 프로그램이 SSL / TLS를 처리해야하는 경우 키 및 인증서 파일을로드하여 보안을 유지할 수 있습니다.
인증서 공급자가 CA (인증 기관) 체인을 필요로하는 경우 ca
옵션에 배열로 추가 할 수 있습니다. 단일 파일에 여러 항목이 포함 된 체인을 여러 파일로 분할하고 Node.js가 현재 하나의 파일에서 여러 ca 항목을 지원하지 않으므로 동일한 순서로 배열에 입력해야합니다. 다음은 파일 1_ca.crt
및 2_ca.crt
대한 예제입니다. ca
배열이 필요하고 올바르게 설정되지 않은 경우 클라이언트 브라우저는 인증서의 진위 여부를 확인할 수없는 메시지를 표시 할 수 있습니다.
예
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('privatekey.pem'),
cert: fs.readFileSync('certificate.pem'),
ca: [fs.readFileSync('1_ca.crt'), fs.readFileSync('2_ca.crt')]
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
HTTPS 사용
Node.js의 HTTPS 서버에 대한 최소 설정은 다음과 같습니다.
const https = require('https');
const fs = require('fs');
const httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
https.createServer(httpsOptions, app).listen(4433);
http 요청을 지원하려면 다음과 같이 약간 수정해야합니다.
const http = require('http');
const https = require('https');
const fs = require('fs');
const httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
HTTPS 서버 설정
시스템에 node.js가 설치되면 아래 절차에 따라 HTTP 및 HTTPS를 모두 지원하는 기본 웹 서버를 실행하십시오!
1 단계 : 인증 기관 구축
키 및 인증서를 저장할 폴더를 만듭니다.
mkdir conf
해당 디렉토리로 이동하십시오.
cd conf
이
ca.cnf
파일을 가져ca.cnf
구성 바로 가기로 사용하십시오.wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf
다음 구성을 사용하여 새 인증 기관을 만듭니다.
openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem
이제
ca-key.pem
과ca-cert.pem
에 인증 기관ca-cert.pem
으므로 서버의 개인 키를 생성 해 봅시다.openssl genrsa -out key.pem 4096
이
server.cnf
파일을 가져server.cnf
구성 바로 가기로 사용하십시오.wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf
이 구성을 사용하여 인증서 서명 요청을 생성하십시오.
openssl req -new -config server.cnf -key key.pem -out csr.pem
요청서에 서명하십시오 :
openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem
2 단계 : 인증서를 루트 인증서로 설치
루트 인증서 폴더에 인증서를 복사하십시오.
sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem
CA 스토어 업데이트 :
sudo update-ca-certificates
Secure express.js 3 응용 프로그램
express.js를 사용하여 보안 연결을 구성하는 구성 (버전 3 이후) :
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');
// Define your key and cert
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
// your express configuration here
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
// Using port 8080 for http and 8443 for https
httpServer.listen(8080);
httpsServer.listen(8443);
그렇게하면 기본 http / https 서버에 신속한 미들웨어를 제공 할 수 있습니다.
1024 미만의 포트에서 앱을 실행하려면 sudo 명령 (권장하지 않음)을 사용하거나 리버스 프록시 (예 : nginx, haproxy)를 사용해야합니다.