Node.js SSL/TLS


SSL/TLS 개념 및 설정 (SSL/TLS Concept and Configuration)

SSL/TLS는 웹 서버와 클라이언트 간의 통신을 암호화하여 데이터의 기밀성과 무결성을 보장합니다. SSL(Secure Sockets Layer)은 과거의 표준이고, 현재는 TLS(Transport Layer Security)가 사용됩니다.

SSL/TLS 인증서 생성

  1. OpenSSL 설치:
   sudo apt-get install openssl
  1. 인증서 생성:
   openssl genrsa -out private.key 2048
   openssl req -new -key private.key -out csr.pem
   openssl x509 -req -days 365 -in csr.pem -signkey private.key -out certificate.pem
  1. Node.js 서버에 SSL/TLS 설정:
   const https = require('https');
   const fs = require('fs');
   const express = require('express');
   const app = express();

   const options = {
     key: fs.readFileSync('private.key'),
     cert: fs.readFileSync('certificate.pem')
   };

   app.get('/', (req, res) => {
     res.send('Hello, SSL/TLS!');
   });

   https.createServer(options, app).listen(443, () => {
     console.log('Server is running on https://localhost');
   });

Passport.js를 사용한 인증 및 권한 부여 (Authentication and Authorization with Passport.js)

Passport.js는 Node.js에서 인증을 처리하기 위한 미들웨어로, 다양한 전략을 통해 인증을 구현할 수 있습니다.

Passport.js 설치 및 설정

  1. 설치:
   npm install passport passport-local express-session
  1. 설정:
   const express = require('express');
   const session = require('express-session');
   const passport = require('passport');
   const LocalStrategy = require('passport-local').Strategy;
   const app = express();

   app.use(express.urlencoded({ extended: false }));
   app.use(session({ secret: 'your_secret_key', resave: false, saveUninitialized: false }));
   app.use(passport.initialize());
   app.use(passport.session());

   passport.use(new LocalStrategy((username, password, done) => {
     if (username === 'user' && password === 'pass') {
       return done(null, { id: 1, username: 'user' });
     } else {
       return done(null, false, { message: 'Incorrect credentials.' });
     }
   }));

   passport.serializeUser((user, done) => {
     done(null, user.id);
   });

   passport.deserializeUser((id, done) => {
     done(null, { id: 1, username: 'user' });
   });

   app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

   app.get('/', (req, res) => {
     if (req.isAuthenticated()) {
       res.send('Hello, authenticated user!');
     } else {
       res.send('Hello, guest!');
     }
   });

   app.listen(3000, () => {
     console.log('Server is running on http://localhost:3000');
   });

JWT(JSON Web Tokens)를 활용한 인증 (Authentication with JWT)

JWT는 JSON 객체를 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다. JWT는 보통 사용자 인증 정보를 포함하고 있으며, 클라이언트와 서버 간의 인증 및 정보 교환에 사용됩니다.

JWT 설치 및 설정

  1. 설치:
   npm install jsonwebtoken bcryptjs
  1. 설정:
   const express = require('express');
   const jwt = require('jsonwebtoken');
   const bcrypt = require('bcryptjs');
   const app = express();

   const users = []; // 간단한 사용자 저장소
   const secretKey = 'your_jwt_secret';

   app.use(express.json());

   // 회원 가입
   app.post('/register', async (req, res) => {
     const hashedPassword = await bcrypt.hash(req.body.password, 8);
     const user = { id: users.length + 1, username: req.body.username, password: hashedPassword };
     users.push(user);
     res.status(201).send('User registered');
   });

   // 로그인
   app.post('/login', async (req, res) => {
     const user = users.find(u => u.username === req.body.username);
     if (user && await bcrypt.compare(req.body.password, user.password)) {
       const token = jwt.sign({ id: user.id }, secretKey, { expiresIn: '1h' });
       res.json({ token });
     } else {
       res.status(401).send('Invalid credentials');
     }
   });

   // 인증 미들웨어
   const authenticateJWT = (req, res, next) => {
     const token = req.header('Authorization')?.split(' ')[1];
     if (token) {
       jwt.verify(token, secretKey, (err, user) => {
         if (err) {
           return res.sendStatus(403);
         }
         req.user = user;
         next();
       });
     } else {
       res.sendStatus(401);
     }
   };

   // 보호된 라우트
   app.get('/protected', authenticateJWT, (req, res) => {
     res.send('Protected content');
   });

   app.listen(3000, () => {
     console.log('Server is running on http://localhost:3000');
   });

종합 예제: SSL/TLS, Passport.js, JWT를 활용한 Node.js 애플리케이션

Step 1: SSL/TLS 설정

const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();

const options = {
  key: fs.readFileSync('private.key'),
  cert: fs.readFileSync('certificate.pem')
};

app.get('/', (req, res) => {
  res.send('Hello, SSL/TLS!');
});

https.createServer(options, app).listen(443, () => {
  console.log('Server is running on https://localhost');
});

Step 2: Passport.js 설정

const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

app.use(session({ secret: 'your_secret_key', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy((username, password, done) => {
  if (username === 'user' && password === 'pass') {
    return done(null, { id: 1, username: 'user' });
  } else {
    return done(null, false, { message: 'Incorrect credentials.' });
  }
}));

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  done(null, { id: 1, username: 'user' });
});

app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

app.get('/', (req, res) => {
  if (req.isAuthenticated()) {
    res.send('Hello, authenticated user!');
  } else {
    res.send('Hello, guest!');
  }
});

Step 3: JWT 설정

const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

const users = []; 
const secretKey = 'your_jwt_secret';

app.use(express.json());

app.post('/register', async (req, res) => {
  const hashedPassword = await bcrypt.hash(req.body.password, 8);
  const user = { id: users.length + 1, username: req.body.username, password: hashedPassword };
  users.push(user);
  res.status(201).send('User registered');
});

app.post('/login', async (req, res) => {
  const user = users.find(u => u.username === req.body.username);
  if (user && await bcrypt.compare(req.body.password, user.password)) {
    const token = jwt.sign({ id: user.id }, secretKey, { expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).send('Invalid credentials');
  }
});

const authenticateJWT = (req, res, next) => {
  const token = req.header('Authorization')?.split(' ')[1];
  if (token) {
    jwt.verify(token, secretKey, (err, user) => {
      if (err) {
        return res.sendStatus(403);
      }
      req.user = user;
      next();
    });
  } else {
    res.sendStatus(401);
  }
};

app.get('/protected', authenticateJWT, (req, res) => {
  res.send('Protected content');
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

이 종합 예제는 Node.js 애플리케이션에서 SSL/TLS를 설정하고, Passport.js와 JWT를 사용하여 인증을 구현하는 방법을 보여줍니다. 이 방법을 통해 애플리케이션의 보안과 인증을 강화할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *