수색…


교차 사이트 요청 위조 방지 (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.crt2_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 단계 : 인증 기관 구축

  1. 키 및 인증서를 저장할 폴더를 만듭니다.

    mkdir conf


  1. 해당 디렉토리로 이동하십시오.

    cd conf


  1. ca.cnf 파일을 가져 ca.cnf 구성 바로 가기로 사용하십시오.

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. 다음 구성을 사용하여 새 인증 기관을 만듭니다.

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. 이제 ca-key.pemca-cert.pem 에 인증 기관 ca-cert.pem 으므로 서버의 개인 키를 생성 해 봅시다.

    openssl genrsa -out key.pem 4096


  1. server.cnf 파일을 가져 server.cnf 구성 바로 가기로 사용하십시오.

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. 이 구성을 사용하여 인증서 서명 요청을 생성하십시오.

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. 요청서에 서명하십시오 :

    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 단계 : 인증서를 루트 인증서로 설치

  1. 루트 인증서 폴더에 인증서를 복사하십시오.

    sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem


  1. 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)를 사용해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow