노드 Node.js
11. 인증과 보안: JWT, OAuth, 세션 관리
안녕하세요! 태마입니다.
Node.js 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
노드 Node.js
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. 웹 애플리케이션에서 인증(Authentication)이 필요한 이유
웹 애플리케이션에서는 사용자의 정보를 안전하게 보호하기 위해 인증 시스템이 필요합니다.
로그인, 회원가입, 접근 제어 등을 구현할 때 안전한 인증 방식을 적용해야 합니다.
📌 인증이 필요한 이유
✔ 사용자 정보 보호 → 비인가자가 개인정보에 접근하지 못하도록 제한
✔ 보안 강화 → 해킹, 세션 탈취, CSRF 등의 공격 방어
✔ 다중 플랫폼 인증 → 웹, 모바일 등 다양한 환경에서 인증 지원
2. 인증 방식 비교 (JWT vs 세션 vs OAuth)
✅ 1) JWT(JSON Web Token) – 토큰 기반 인증
특징설명
토큰 기반 인증 | 로그인 후 JWT 토큰을 발급하여 인증 진행 |
무상태(Stateless) | 서버가 세션을 유지하지 않음 |
보안 | 토큰이 유출되면 보안 취약 |
✅ 2) 세션(Session) – 서버 기반 인증
특징설명
서버에 사용자 세션 저장 | 사용자가 로그인하면 서버가 세션을 유지 |
상태 기반(Stateful) | 서버에서 사용자 정보를 유지해야 함 |
보안 | 세션 ID를 안전하게 관리해야 함 |
✅ 3) OAuth – 제3자 인증 방식
특징설명
SNS 로그인 지원 | Google, Facebook, Kakao 등의 계정으로 로그인 가능 |
토큰 기반 | 인증 후 Access Token을 발급하여 사용 |
보안 | 권한 부여 범위를 설정 가능 (ex. 이메일만 제공) |
📌 JWT는 토큰 기반으로 간편하지만, OAuth는 제3자 인증을 활용할 때 유용!
✅ 여기까지 인증 방식의 개념과 차이점을 배웠습니다!
👉 "그렇다면, Node.js에서 JWT 인증을 어떻게 구현할까?"
✅ 2부에서 JWT 기반 로그인 시스템을 구축하는 방법을 배워봅시다!
2. 상세 주제 정리
1. JWT(JSON Web Token) 기반 인증이란?
JWT는 사용자의 인증 정보를 JSON 형태로 인코딩한 토큰입니다.
로그인하면 JWT 토큰을 발급하고, 이후 요청에서 해당 토큰을 사용하여 인증합니다.
✅ JWT 구조 (3가지 부분으로 구성됨)
헤더(Header) | 페이로드(Payload) | 서명(Signature)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VySWQiOiIxMjM0NTYiLCJpYXQiOjE2ODAwMDAwMDB9
.
h1hG3bJH5K...
📌 JWT를 사용하면 세션 저장 없이 간편하게 인증 가능!
2. Node.js에서 JWT 기반 로그인 시스템 구현
✅ 1) JWT 관련 패키지 설치
$ npm install express jsonwebtoken dotenv bcryptjs
📌 jsonwebtoken(JWT 생성 및 검증), bcryptjs(비밀번호 암호화), dotenv(환경 변수 관리) 사용!
✅ 2) JWT를 이용한 로그인 시스템 구현
const express = require("express");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const dotenv = require("dotenv");
dotenv.config();
const app = express();
app.use(express.json());
const users = []; // 사용자 저장 (DB 대체)
app.post("/register", async (req, res) => {
const hashedPassword = await bcrypt.hash(req.body.password, 10);
users.push({ username: req.body.username, password: hashedPassword });
res.send("회원가입 완료!");
});
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))) {
return res.status(401).send("인증 실패!");
}
const token = jwt.sign({ username: user.username }, process.env.JWT_SECRET, { expiresIn: "1h" });
res.json({ token });
});
📌 회원가입 시 비밀번호를 해시(hash)로 저장하고, 로그인 시 토큰을 발급!
✅ 3) JWT 토큰 검증 미들웨어 추가
const authenticateToken = (req, res, next) => {
const token = req.header("Authorization");
if (!token) return res.status(401).send("접근 거부!");
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) return res.status(403).send("토큰이 유효하지 않음!");
req.user = user;
next();
});
};
app.get("/protected", authenticateToken, (req, res) => {
res.send(`환영합니다, ${req.user.username}!`);
});
📌 JWT 토큰이 있는 사용자만 특정 API에 접근할 수 있도록 제한!
✅ 4) JWT 토큰을 활용한 인증 흐름
1️⃣ 사용자가 /login 요청 → 서버에서 JWT 발급
2️⃣ 클라이언트가 이후 요청에 Authorization: Bearer <JWT> 포함
3️⃣ 서버는 jwt.verify()로 토큰을 검증 후 API 응답
3. OAuth 로그인 구현 (Google OAuth 2.0)
✅ 1) OAuth 관련 패키지 설치
npm install passport passport-google-oauth20
📌 Google OAuth를 사용하여 로그인 기능 구현 가능!
✅ 2) OAuth 로그인 구현 (Google)
const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth20").Strategy;
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: "/auth/google/callback"
}, (accessToken, refreshToken, profile, done) => {
return done(null, profile);
}));
app.get("/auth/google", passport.authenticate("google", { scope: ["profile", "email"] }));
app.get("/auth/google/callback", passport.authenticate("google", { failureRedirect: "/" }), (req, res) => {
res.send("Google 로그인 성공!");
});
📌 Google 계정으로 로그인 후, 사용자 정보를 받아와 인증 진행!
4. 보안 강화를 위한 Best Practice
✅ JWT 보안 강화 방법
✔ 비밀 키(.env)로 관리 → JWT_SECRET을 환경 변수로 저장
✔ 토큰 만료 시간 설정 → expiresIn: "1h"로 제한
✔ Refresh Token 사용 → 액세스 토큰이 만료되면 재발급 가능
✅ OAuth 보안 강화 방법
✔ Redirect URI 제한 → 신뢰할 수 있는 도메인만 허용
✔ Scope 최소화 → 불필요한 권한 요청 방지
✔ HTTPS 사용 → 데이터 암호화를 위해 HTTPS 적용
📌 보안 취약점을 예방하고 안전한 인증 시스템을 설계하는 것이 중요!
✅ 여기까지 Node.js에서 JWT, OAuth, 세션을 활용한 인증 시스템 구축 방법을 배웠습니다!
👉 "그렇다면, Express에서 미들웨어를 활용하여 API 요청을 제어할 수 있을까?"
✅ 다음 회차에서 Express의 미들웨어 개념과 활용법을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)> (1) | 2025.03.17 |
---|---|
Node.js 기초 <14. 클라우드 스토리지(AWS S3, Firebase)와 파일 업로드> (0) | 2025.03.16 |
Node.js 기초 <13. 파일 업로드와 이미지 처리 (multer 활용)> (0) | 2025.03.15 |
Node.js 기초 <12. Express의 미들웨어와 요청 처리 흐름> (0) | 2025.03.14 |
Node.js 기초 <10. 웹소켓(WebSocket)과 실시간 데이터 처리> (1) | 2025.03.12 |
Node.js 기초 <9. 파일 시스템(fs 모듈)과 스트림(Stream) 활용> (0) | 2025.03.11 |
Node.js 기초 <8. Node.js와 데이터베이스 (MySQL, PostgreSQL, MongoDB)> (0) | 2025.03.10 |
Node.js 기초 <7. RESTful API 개발: CRUD 구현 및 HTTP 요청 처리> (0) | 2025.03.09 |