본문 바로가기
source-code/network

VCP를 통해 Next.js ↔ AWS RDS 안전하게 연결하기

by mattew4483 2024. 8. 25.
728x90
반응형

Backgrounds

Next.js를 사용하여 애플리케이션을 개발한 후, AWS Amplify를 통해 배포하는 과정을 진행했습니다.
이 과정에서 RDS(Relational Database Service)를 사용하여 데이터베이스를 설정하고, Next.js의 서버 컴포넌트에서 데이터를 조회하고 생성하는 기능을 구현했습니다.
 

import React from 'react';
import { Pool } from 'pg';

const pool = new Pool({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_DATABASE,
  password: process.env.DB_PASSWORD,
  port: process.env.DB_PORT as unknown as number,
});

const page = async () => {
  const query = `SELECT * FROM book`;

  const { rows } = await pool.query(query); // 서버 컴포넌트에서 DB 직접 조회
  const isResultExist = rows.length > 0;
  if (!isResultExist) {
    return <h1>검색 결과가 없습니다!</h1>;
  };

  return (
    <div>
      {rows.map((data) => (
        <>
          {data.name}
        </>
      ))}
    </div>
  );
};

export default page;

위 예시처럼 서버 컴포넌트에서 데이터베이스에 직접 접근해 쿼리를 실행할 수 있으며, 이때 클라이언트 측에는 데이터베이스 연결 정보나 쿼리 로직이 노출되지 않습니다. 이를 통해 보안성이 강화된 환경에서 데이터를 안전하게 처리할 수 있습니다.
 

Problems

그러나 배포 과정에서 중요한 문제가 발생했습니다. RDS는 보안 그룹을 통해 허용 가능한 IP 주소를 지정할 수 있는데, Next.js 애플리케이션은 클라이언트의 요청에 따라 IP 주소가 변경됩니다. 이는 보안 그룹에 특정 IP를 지정하여 RDS에 안전하게 접근하는 데 큰 제약이 되었습니다. 이 문제를 해결하기 위해 VPC(가상 프라이빗 클라우드)를 활용해 RDS 보안 그룹을 설정했습니다.
 

Solutions

VPC란 무엇인가?

VPC(가상 프라이빗 클라우드)는 AWS에서 제공하는 네트워크 서비스로, 사용자가 정의한 가상 네트워크 환경을 제공하여 리소스(예: EC2 인스턴스, RDS 데이터베이스 등)를 안전하게 격리하고 관리할 수 있게 해 줍니다. VPC를 사용하면, 네트워크 구성과 보안 설정을 보다 세밀하게 제어할 수 있으며, 내부 네트워크와 외부 인터넷 간의 트래픽을 관리할 수 있습니다.

주요 특징

1. 서브넷(Subnet)

VPC 내에서 IP 주소 범위를 지정하여 논리적 네트워크를 분할합니다. 서브넷은 퍼블릭 서브넷(인터넷과 연결된)과 프라이빗 서브넷(인터넷에 직접 연결되지 않고 내부 네트워크에서만 접근 가능한)으로 나눌 수 있습니다.
 

2. 보안 그룹(Security Group) 

인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 합니다. 보안 그룹을 통해 특정 IP 주소나 IP 범위에서 들어오거나 나가는 트래픽을 허용하거나 차단할 수 있습니다. 보안 그룹은 상태 기반(Stateful) 방화벽으로, 인바운드 트래픽이 허용된 경우 해당 세션의 아웃바운드 트래픽도 자동으로 허용됩니다.
 

3. NAT 게이트웨이(NAT Gateway)

프라이빗 서브넷의 리소스가 인터넷과 통신할 수 있도록 하면서, 외부에서의 직접적인 접근을 방지할 수 있습니다. 프라이빗 서브넷 내의 인스턴스는 NAT 게이트웨이를 통해 인터넷에 접근할 수 있지만, 외부에서는 프라이빗 서브넷으로 직접 접근할 수 없습니다.
 

VPC를 활용한 RDS 보안 그룹 설정

1. VPC 내에서 RDS와 애플리케이션 서버 설정

Next.js 애플리케이션과 RDS를 동일한 VPC 내에 배치하여, 네트워크 내에서 직접적으로 통신할 수 있도록 설정합니다. 이렇게 하면, RDS와 Next.js 애플리케이션 간의 트래픽은 외부 인터넷을 거치지 않고 내부적으로 처리되므로, 보안이 강화됩니다.
 
Amplify에서 VPC 설정
저의 경우, Amplify를 통해 프론트엔드 애플리케이션을 구성했습니다. Amplify 프로젝트의 설정에서 VPC 연결을 활성화 해, Amplify 앱이 특정 VPC와 서브넷에 연결되도록 설정할 수 있습니다.
 

2.  보안 그룹 구성

VPC 내에서 RDS 인스턴스를 위한 보안 그룹을 설정하고, 인바운드 트래픽을 Next.js 애플리케이션이 위치한 서브넷의 IP 주소 범위로 제한합니다. 이 방법을 사용하면, Next.js 애플리케이션에서 발생하는 요청이 허용된 IP 주소 범위 내에서만 이루어지므로, RDS에 안전하게 접근할 수 있습니다.

- VPC
  - 퍼블릭 서브넷: Next.js 애플리케이션 배포 (EC2 인스턴스 또는 Amplify)
  - 프라이빗 서브넷: RDS 인스턴스 배치
  - 보안 그룹: Next.js 애플리케이션의 퍼블릭 서브넷 IP 범위에서 RDS로의 접근만 허용

3.  NAT 게이트웨이 설정

만약 프라이빗 서브넷에 배치된 RDS에서 외부 API와 통신이 필요한 경우, NAT 게이트웨이를 통해 이 통신이 가능하도록 설정합니다. 이를 통해 RDS는 외부에서 접근할 수 없지만, 외부로의 요청은 허용됩니다.

728x90
반응형