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를 사용하여 인증을 구현하는 방법을 보여줍니다. 이 방법을 통해 애플리케이션의 보안과 인증을 강화할 수 있습니다.