«   2025/02   »
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
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

SaaS에서 유저 도메인 설정 테스트 본문

스터디

SaaS에서 유저 도메인 설정 테스트

행복한 수지아빠 2025. 2. 13. 11:52

Node.js와 Express를 사용하여 SaaS 형태의 유저 도메인 설정을 처리하는 시스템을 만드는 방법을 단계별로 설명해줄게. 기본적으로 유저가 자신의 도메인을 추가하면 Express 서버가 해당 도메인을 인식하고, Nginx 또는 Express의 미들웨어를 사용하여 트래픽을 라우팅하는 방식으로 진행할 거야.


📌 1. 프로젝트 초기 설정

1️⃣ Node.js 프로젝트 생성

mkdir saas-dns
cd saas-dns
npm init -y

2️⃣ 필요한 패키지 설치

npm install express body-parser dotenv cors
npm install --save-dev nodemon
  • express: 웹 서버
  • body-parser: JSON 요청 처리
  • dotenv: 환경 변수 관리
  • cors: CORS 처리
  • nodemon: 개발 중 자동 리로드

📌 2. 기본 Express 서버 만들기

📁 server.js

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");

const app = express();
const PORT = process.env.PORT || 3000;

// JSON 요청을 처리하기 위한 미들웨어
app.use(bodyParser.json());

// 도메인 정보를 저장할 메모리 DB (실제 서비스에서는 DB 사용)
let domainMappings = {};

// 유저가 자신의 도메인을 추가하는 API
app.post("/add-domain", (req, res) => {
    const { domain, userId } = req.body;

    if (!domain || !userId) {
        return res.status(400).json({ message: "도메인과 유저 ID를 입력하세요." });
    }

    // 도메인을 저장
    domainMappings[domain] = userId;

    res.json({ message: "도메인이 추가되었습니다!", domain, userId });
});

// 요청된 도메인을 확인하는 미들웨어
app.use((req, res, next) => {
    const host = req.hostname; // 요청된 도메인 가져오기

    if (domainMappings[host]) {
        req.userId = domainMappings[host];
        return next();
    }

    res.status(404).json({ message: "도메인이 등록되지 않았습니다." });
});

// 유저별 콘텐츠 제공 API
app.get("/", (req, res) => {
    res.json({ message: `유저 ${req.userId}의 맞춤 서비스입니다.` });
});

// 서버 실행
app.listen(PORT, () => {
    console.log(`서버 실행 중: http://localhost:${PORT}`);
});

✅ 이 코드에서는 유저가 자신의 도메인을 추가할 수 있도록 /add-domain API를 만들었고, 도메인에 대한 요청을 필터링하는 미들웨어를 추가했어.


📌 3. Nginx로 도메인 라우팅 설정

Express 자체로는 도메인을 직접 처리하기 어렵기 때문에, **Nginx를 리버스 프록시(reverse proxy)**로 설정해야 해.

1️⃣ Nginx 설치 (Ubuntu 기준)

sudo apt update
sudo apt install nginx -y

2️⃣ Nginx 설정 파일 수정

📁 /etc/nginx/sites-available/saas

server {
    listen 80;
    server_name ~^(?<subdomain>.+)\.your-saas\.com$;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • server_name ~^(?<subdomain>.+)\.your-saas\.com$;
    • user1.your-saas.com처럼 모든 서브도메인을 Express 서버로 라우팅.

3️⃣ 설정 적용 및 Nginx 재시작

sudo ln -s /etc/nginx/sites-available/saas /etc/nginx/sites-enabled/
sudo nginx -t  # 설정 파일 검사
sudo systemctl restart nginx

📌 4. 유저 도메인 연결 테스트

1️⃣ 로컬에서 테스트하기 (hosts 파일 수정)

로컬에서 실제 도메인 없이 테스트하려면, /etc/hosts 파일을 수정해야 해.

sudo nano /etc/hosts

다음 내용을 추가:

127.0.0.1  user1.your-saas.com
127.0.0.1  user2.your-saas.com

이제 브라우저에서 http://user1.your-saas.com 또는 http://user2.your-saas.com에 접속하면 Express 서버로 요청이 전달될 거야.


📌 5. 도메인 연결을 위한 Cloudflare API 사용 (선택 사항)

Cloudflare API를 이용하면 SaaS 유저가 자신의 도메인을 추가할 때 CNAME을 자동으로 설정할 수 있어.

1️⃣ Cloudflare API를 사용하여 CNAME 추가

📁 cloudflare.js

const axios = require("axios");
require("dotenv").config();

const CLOUDFLARE_API = "https://api.cloudflare.com/client/v4/zones";
const CLOUDFLARE_ZONE_ID = process.env.CLOUDFLARE_ZONE_ID;
const CLOUDFLARE_API_KEY = process.env.CLOUDFLARE_API_KEY;
const CLOUDFLARE_EMAIL = process.env.CLOUDFLARE_EMAIL;

async function addCnameRecord(subdomain) {
    try {
        const response = await axios.post(
            `${CLOUDFLARE_API}/${CLOUDFLARE_ZONE_ID}/dns_records`,
            {
                type: "CNAME",
                name: subdomain,
                content: "your-saas.com",
                proxied: true
            },
            {
                headers: {
                    "X-Auth-Email": CLOUDFLARE_EMAIL,
                    "X-Auth-Key": CLOUDFLARE_API_KEY,
                    "Content-Type": "application/json"
                }
            }
        );

        console.log("CNAME 추가 성공:", response.data);
    } catch (error) {
        console.error("CNAME 추가 실패:", error.response.data);
    }
}

// 예제 실행
addCnameRecord("user1.your-saas.com");

🔹 Cloudflare API 키, Zone ID, 이메일 정보는 .env 파일에 저장해야 함!

CLOUDFLARE_ZONE_ID=YOUR_ZONE_ID
CLOUDFLARE_API_KEY=YOUR_API_KEY
CLOUDFLARE_EMAIL=YOUR_EMAIL

📌 6. SSL 인증서 자동 발급

Let's Encrypt와 Certbot을 사용하여 SSL을 자동 발급하면, 유저가 도메인을 추가할 때마다 보안이 적용된 상태로 서비스할 수 있어.

1️⃣ Certbot 설치 (Ubuntu 기준)

sudo apt install certbot python3-certbot-nginx -y

2️⃣ SSL 인증서 발급 및 적용

sudo certbot --nginx -d user1.your-saas.com

📌 이 과정은 자동화할 수도 있어. 예를 들어, 도메인을 추가할 때마다 certbot을 실행하는 스크립트를 만들 수 있어.


📌 7. 전체 개발 흐름 요약

1️⃣ Express 서버에서 유저 도메인을 저장하고 트래픽을 처리
2️⃣ Nginx Reverse Proxy를 이용해 서브도메인 라우팅
3️⃣ Cloudflare API를 사용해 도메인 자동 등록 (선택 사항)
4️⃣ Let's Encrypt를 이용한 SSL 인증서 자동 발급
5️⃣ /etc/hosts를 이용한 로컬 테스트

 

'스터디' 카테고리의 다른 글

Story 생태계  (0) 2025.02.13
MkDocs란 무엇인가  (0) 2025.02.13
SaaS에서 유저가 도메인 입력하는 건 어떻게 개발되나  (0) 2025.02.13
NestJS에서의 Fail2Ban란  (0) 2025.02.12
Cursor AI Rule에 대해 기초 정리  (0) 2025.02.12