뷰 엔진과 템플릿 엔진 (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 웹 애플리케이션 개발의 기본을 이해하고, 실용적인 기술을 습득할 수 있습니다.
