Node.js Web Application Development

뷰 엔진과 템플릿 엔진 (View Engines and Template Engines)

Node.js 웹 애플리케이션 개발에서 뷰 엔진과 템플릿 엔진은 서버 측에서 HTML을 생성하는 데 사용됩니다. 대표적인 엔진으로 Pug와 EJS가 있습니다.

Pug

Pug는 간결한 문법을 사용하여 HTML을 생성하는 템플릿 엔진입니다.

Pug 설치 및 설정
npm install pug

Express 애플리케이션에서 Pug를 사용하는 방법입니다.

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

app.set('view engine', 'pug');
app.set('views', './views');

app.get('/', (req, res) => {
  res.render('index', { title: 'Welcome', message: 'Hello, Pug!' });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
Pug 템플릿 예제
//- views/index.pug
doctype html
html
  head
    title= title
  body
    h1= message

EJS

EJS는 JavaScript 문법을 사용하여 HTML을 생성하는 템플릿 엔진입니다.

EJS 설치 및 설정
npm install ejs

Express 애플리케이션에서 EJS를 사용하는 방법입니다.

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

app.set('view engine', 'ejs');
app.set('views', './views');

app.get('/', (req, res) => {
  res.render('index', { title: 'Welcome', message: 'Hello, EJS!' });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
EJS 템플릿 예제
<!-- views/index.ejs -->
<!DOCTYPE html>
<html>
<head>
  <title><%= title %></title>
</head>
<body>
  <h1><%= message %></h1>
</body>
</html>

사용자 인증과 세션 관리 (User Authentication and Session Management)

Node.js 애플리케이션에서 사용자 인증과 세션 관리를 위해 Passport.js를 사용할 수 있습니다.

Passport.js 설치 및 설정

npm install passport passport-local express-session
Passport.js 설정
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const app = express();

app.use(session({ secret: 'secretKey', resave: false, saveUninitialized: true }));
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, name: 'User' });
    } else {
      return done(null, false);
    }
  }
));

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

passport.deserializeUser((id, done) => {
  done(null, { id: 1, name: '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 port 3000');
});

웹 소켓을 활용한 실시간 통신 (Real-time Communication with WebSockets)

웹 소켓을 사용하면 서버와 클라이언트 간에 실시간 양방향 통신이 가능합니다. Node.js에서는 Socket.io를 사용하여 쉽게 구현할 수 있습니다.

Socket.io 설치 및 설정

npm install socket.io
Socket.io 서버 설정
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
  console.log('a user connected');

  socket.on('chat message', (msg) => {
    io.emit('chat message', msg);
  });

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});
클라이언트 코드
<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Chat</title>
  </head>
  <body>
    <ul id="messages"></ul>
    <form id="form" action="">
      <input id="input" autocomplete="off" /><button>Send</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io();
      var form = document.getElementById('form');
      var input = document.getElementById('input');
      var messages = document.getElementById('messages');

      form.addEventListener('submit', function(e) {
        e.preventDefault();
        if (input.value) {
          socket.emit('chat message', input.value);
          input.value = '';
        }
      });

      socket.on('chat message', function(msg) {
        var item = document.createElement('li');
        item.textContent = msg;
        messages.appendChild(item);
        window.scrollTo(0, document.body.scrollHeight);
      });
    </script>
  </body>
</html>

보안 관리 (Security Management)

Node.js 애플리케이션에서 보안 관리에는 사용자 입력 검증, CSRF 방어, XSS 방어 등이 포함됩니다.

사용자 입력 검증 (User Input Validation)

express-validator를 사용하여 사용자 입력을 검증할 수 있습니다.

npm install express-validator
예제 코드
const express = require('express');
const { body, validationResult } = require('express-validator');

const app = express();

app.use(express.json());

app.post('/register', [
  body('username').isAlphanumeric().withMessage('Username must be alphanumeric'),
  body('password').isLength({ min: 6 }).withMessage('Password must be at least 6 characters long')
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  res.send('User registered successfully');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

CSRF 방어 (CSRF Protection)

csurf 미들웨어를 사용하여 CSRF 공격을 방어할 수 있습니다.

npm install csurf
예제 코드
const express = require('express');
const session = require('express-session');
const csurf = require('csurf');

const app = express();

app.use(session({ secret: 'secretKey', resave: false, saveUninitialized: true }));
app.use(express.urlencoded({ extended: false }));
app.use(csurf());

app.get('/form', (req, res) => {
  res.send(`<form action="/process" method="POST">
              <input type="hidden" name="_csrf" value="${req.csrfToken()}">
              <button type="submit">Submit</button>
            </form>`);
});

app.post('/process', (req, res) => {
  res.send('Form processed successfully');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

XSS 방어 (XSS Protection)

xss-clean 패키지를 사용하여 XSS 공격을 방어할 수 있습니다.

npm install xss-clean
예제 코드
const express = require('express');
const xss = require('xss-clean');

const app = express();

app.use(express.json());
app.use(xss());

app.post('/submit', (req, res) => {
  res.send('Data submitted successfully');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

이 문서에서는 Node.js를 사용한 웹 애플리케이션 개발의 다양한 측면을 다루었습니다. 뷰 엔진과 템플릿 엔진 설정, 사용자 인증과 세션 관리, 웹 소켓을 활용한 실시간 통신, 그리고 보안 관리 방법을 소개하고, 상세한 설명과 함께 다양한 예제를 제공하였습니다. 이를 통해 Node.js 웹 애플리케이션 개발의 기본을 이해하고, 실용적인 기술을 습득할 수 있습니다.

Leave a Reply

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