티스토리 뷰

반응형

웹 개발 실무 기술 A to Z

웹 애플리케이션은 사용자 인증, 권한 관리, API 보안을 철저하게 적용해야 합니다.
✔️ OAuth 2.0 → 안전한 사용자 인증 및 서드파티 로그인 지원
✔️ JWT(JSON Web Token) → 토큰 기반 인증 시스템
✔️ API 보안 전략 → DDoS 방어, Rate Limiting, HTTPS 적용

이번 글에서는 OAuth 2.0, JWT, API 보안 강화 전략을 상세히 살펴보겠습니다.


1. OAuth 2.0 – 서드파티 인증 시스템

1-1. OAuth 2.0 개념

✔️ OAuth 2.0은 외부 서비스(Google, Facebook, GitHub 등)를 통해 사용자 인증을 제공하는 표준 프로토콜입니다.
✔️ 비밀번호 없이 안전하게 사용자를 인증 가능
✔️ Access Token을 발급하여 API 요청에 사용

1-2. OAuth 2.0 인증 흐름

1️⃣ 사용자가 Google 로그인 버튼 클릭
2️⃣ OAuth 서버(Google)에서 사용자 인증
3️⃣ 사용자가 로그인 승인
4️⃣ OAuth 서버가 Access Token 발급
5️⃣ 애플리케이션이 Access Token을 사용하여 API 호출


1-3. Google OAuth 2.0 인증 구현 (Node.js + Passport.js)

(1) OAuth 2.0 패키지 설치

npm install passport passport-google-oauth20 dotenv express-session

(2) Google OAuth 설정 (.env 파일)

GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret

(3) Passport.js로 OAuth 2.0 인증

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.json({ message: "Google Login Successful!", user: req.user });
});

OAuth 2.0을 사용하면 비밀번호 없이 안전한 로그인 구현 가능!


2. JWT (JSON Web Token) – API 인증 방식

2-1. JWT 개념

✔️ 사용자 인증 후, Access Token을 발급하여 API 요청 시 사용
✔️ 서버가 세션을 저장할 필요 없이 클라이언트가 토큰을 보유
✔️ JWT 구조

Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyX2lkIjoxLCJleHAiOjE2NjU0NTYwMDB9.
HMACSHA256(헤더 + 페이로드, 비밀 키)

2-2. JWT 인증 흐름

1️⃣ 사용자가 로그인 요청 → 아이디 & 비밀번호 전송
2️⃣ 서버가 JWT 생성 및 발급
3️⃣ 클라이언트가 JWT를 저장하고 API 요청 시 포함 (Authorization: Bearer <token>)
4️⃣ 서버는 JWT를 검증하고 요청 처리


2-3. Node.js + Express로 JWT 인증 구현

(1) JWT 패키지 설치

npm install jsonwebtoken express bcryptjs dotenv

(2) JWT 생성 (로그인 시 토큰 발급)

const express = require("express");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
require("dotenv").config();

const app = express();
app.use(express.json());

const users = [
  { id: 1, username: "admin", password: "$2a$10$abcdefghi" } // 암호화된 비밀번호 저장
];

app.post("/login", async (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username);
  
  if (!user || !(await bcrypt.compare(password, user.password))) {
    return res.status(401).json({ error: "Invalid credentials" });
  }

  const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: "1h" });
  res.json({ token });
});

(3) JWT 검증 미들웨어

const authMiddleware = (req, res, next) => {
  const token = req.header("Authorization")?.split(" ")[1];
  
  if (!token) return res.status(401).json({ error: "Access denied" });

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (error) {
    res.status(401).json({ error: "Invalid token" });
  }
};

// 보호된 API 엔드포인트
app.get("/protected", authMiddleware, (req, res) => {
  res.json({ message: "You have access!", user: req.user });
});

JWT를 활용하면 API 인증을 세션 없이 관리 가능!


3. API 보안 강화 전략

3-1. HTTPS 적용

✔️ 데이터 암호화를 위해 HTTPS 적용 필수
✔️ Let’s Encrypt를 사용하여 무료 SSL 인증서 적용

sudo certbot --nginx -d example.com -d www.example.com

3-2. Rate Limiting (DDoS 방어)

✔️ 과도한 API 요청을 제한하여 DDoS 공격 방어

npm install express-rate-limit
const rateLimit = require("express-rate-limit");

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15분 동안
  max: 100, // 최대 100개 요청 허용
  message: "Too many requests, please try again later.",
});

app.use("/api/", limiter); // API 요청에만 적용

Rate Limiting을 설정하면 API 남용을 방지할 수 있음!


3-3. 보안 헤더 설정 (Helmet 활용)

✔️ CORS, XSS 보호 및 보안 헤더 추가

npm install helmet
const helmet = require("helmet");
app.use(helmet());

보안 헤더를 적용하여 API 보안을 강화 가능!


4. 마무리 및 다음 글 예고

이번 글에서는 OAuth 2.0, JWT 인증, API 보안 강화 전략을 살펴봤습니다.
다음 글에서는 **대규모 트래픽을 처리하는 고성능 웹 아키텍처 (로드 밸런싱, 캐싱, 마이크로서비스 확장)**을 소개하겠습니다.

다음 글 예고: "고성능 웹 아키텍처 – 로드 밸런싱, 캐싱, 마이크로서비스 확장" 🚀

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함
반응형