SSL/TLS 개념 및 설정 (SSL/TLS Concept and Configuration)
SSL/TLS는 웹 서버와 클라이언트 간의 통신을 암호화하여 데이터의 기밀성과 무결성을 보장합니다. SSL(Secure Sockets Layer)은 과거의 표준이고, 현재는 TLS(Transport Layer Security)가 사용됩니다.
SSL/TLS 인증서 생성
- OpenSSL 설치:
sudo apt-get install openssl
- 인증서 생성:
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
- 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 설치 및 설정
- 설치:
npm install passport passport-local express-session
- 설정:
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 설치 및 설정
- 설치:
npm install jsonwebtoken bcryptjs
- 설정:
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를 사용하여 인증을 구현하는 방법을 보여줍니다. 이 방법을 통해 애플리케이션의 보안과 인증을 강화할 수 있습니다.
