# PostgreSQL 로 해커를 격퇴한다! 에이전트 인증으로 데이터베이스 보안 강화 방법

*SEO 키워드: PostgreSQL 보안, 에이전트 인증, 데이터베이스 해킹 방지*

---

# # 서론 – “내 데이터베이스가 해킹당한다면?”

최근 클라우드·SaaS 환경이 급성장하면서 **데이터베이스 해킹** 사례가 늘어나고 있습니다.

특히 PostgreSQL 은 오픈소스라서 인기가 높지만, 기본 설정만으로는 **내부·외부 공격**을 완벽히 막기 어렵다는 지적을 받습니다.

“**PostgreSQL에 직접 ‘전투 능력’**을 부여한다면 어떨까?” 라는 질문에서 시작된 것이 바로 **Agent Auth(에이전트 인증)** 입니다.

이 글에서는 **Agentic Postgres Challenge**에서 선보인 방법을 바탕으로, 초보자도 손쉽게 구현할 수 있는 **PostgreSQL 보안** 전략을 단계별로 풀어봅니다.

---

# # 본론

## # 1️⃣ 에이전트 인증이란? – 개념과 장점

| 용어 | 의미 |

|------|------|

| **에이전트** | 애플리케이션·서비스가 데이터베이스에 접근할 때 사용하는 **고유 토큰** 또는 **인증서** |

| **에이전트 인증** | 에이전트가 제시한 토큰을 검증해 **권한을 동적으로 부여**하는 방식 |

| **장점** | • 최소 권한 원칙 구현 <br>• 토큰 회전으로 지속적인 보안 강화 <br>• 감사 로그에 누가, 언제, 어떤 데이터를 조회했는지 명확히 기록 |

전통적인 **사용자‑비밀번호** 기반 인증은 한 번 탈취되면 전체 권한이 노출됩니다. 반면 에이전트 인증은 **토큰 기반**이기 때문에 토큰이 유출돼도 **유효 기간**과 **스코프(scope)** 를 제한해 피해를 최소화할 수 있습니다.

## # 2️⃣ PostgreSQL 에이전트 인증 구현 흐름

1. **에이전트 토큰 발급** – 별도 인증 서버(OAuth2, JWT 등)에서 서비스 전용 토큰을 발행합니다.

2. **PostgreSQL에 토큰 검증 함수 등록** – `plpgsql` 혹은 `plpythonu` 로 외부 API 호출 혹은 공개키 검증 로직을 구현합니다.

3. **Row‑Level Security(RLS) 정책 정의** – 토큰 검증 결과에 따라 **행 수준** 접근을 제한합니다.

4. **세션 설정** – 클라이언트 연결 시 `SET my.agent_token = '...'` 로 토큰을 전달합니다.

> **핵심 포인트** : 토큰 검증은 **한 번만** 수행하고, 결과를 세션 변수에 저장해 이후 쿼리에서는 빠르게 재사용합니다.

## # 3️⃣ 실전 예제 – 5분 만에 에이전트 인증 적용하기

### # 3‑1. 토큰 검증 함수 만들기

```
sql

-- plpgsql 로 간단히 JWT 서명을 검증하는 예

CREATE OR REPLACE FUNCTION auth.validate_jwt(token TEXT)

RETURNS BOOLEAN AS $$

DECLARE

    header TEXT;

    payload TEXT;

    signature TEXT;

    secret_key CONSTANT TEXT := 'my_super_secret_key';

BEGIN

    -- 토큰을 . 로 분리

    header   := split_part(token, '.', 1);

    payload  := split_part(token, '.', 2);

    signature:= split_part(token, '.', 3);

    -- HMAC SHA256 검증 (실제 환경에서는 pgcrypto 사용)

    RETURN encode(

        hmac(concat_ws('.', header, payload), secret_key, 'sha256'),

        'base64'

    ) = signature;

END;

$$ LANGUAGE plpgsql SECURITY DEFINER;

```

> **TIP** : 프로덕션에서는 `pgcrypto` 확장과 RSA 공개키 검증을 권장합니다.

### # 3‑2. 세션 변수에 토큰 저장

```
sql

-- 클라이언트 연결 시 실행 (예: psql -c 'SET my.agent_token = 'eyJ...'')

SET my.agent_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';

```

### # 3‑3. RLS 정책으로 행 제한

```
sql

-- 예시 테이블

CREATE TABLE orders (

    id      SERIAL PRIMARY KEY,

    user_id INT NOT NULL,

    amount  NUMERIC,

    created_at TIMESTAMP DEFAULT now()

);

-- RLS 활성화

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;

-- 정책: 토큰에 포함된 user_id와 일치하는 행만 조회 허용

CREATE POLICY order_owner_policy ON orders

USING (

    auth.validate_jwt(current_setting('my.agent_token')) AND

    (payload->>'sub')::INT = user_id   -- payload 에서 user_id 추출 가정

);

```

위와 같이 설정하면 **인증된 에이전트**만 자신의 주문 데이터를 볼 수 있게 됩니다.

### # 3‑4. 감사 로그 남기기

```
sql

CREATE EXTENSION IF NOT EXISTS pg_audit;

-- audit 로그에 토큰 정보(해시) 기록

ALTER SYSTEM SET pgaudit.log = 'read,write';

SELECT pg_reload_conf();

```

## # 4️⃣ 보안 모범 사례 – 놓치기 쉬운 포인트

| 체크리스트 | 설명 |

|------------|------|

| **토큰 최소 권한** | 토큰에 **scope** 를 지정해 필요한 테이블·컬럼만 접근하도록 제한 |

| **짧은 유효 기간** | 5~15분 정도의 **TTL** 로 토큰을 자주 회전 |

| **TLS 적용** | 데이터베이스와 애플리케이션 간 통신은 반드시 **TLS** 로 암호화 |

| **키 관리** | 비밀키·공개키는 **Vault**·**AWS KMS** 등 안전한 저장소에 보관 |

| **정기 감사** | `pg_audit` 로그를 주기적으로 분석해 비정상적인 접근 시도 탐지 |

## # 5️⃣ 실무 적용 사례 – Tiger Data 의 성공 스토리

- **배경** : 다수의 SaaS 고객을 보유한 Tiger Data는 고객사 데이터베이스에 **멀티 테넌트** 방식으로 접근해야 했습니다.

- **문제** : 기존 사용자‑비밀번호 인증으로는 **테넌트 간 데이터 격리**가 어려워 해킹 위험이 높았습니다.

- **솔루션** : 위에서 설명한 **Agent Auth** 를 도입, 각 테넌트에 고유 JWT 토큰을 발행하고 RLS 정책으로 행 수준 격리 구현.

- **결과** : 3개월 내 **보안 사고 0건** 달성, 감사 로그를 통해 **실시간 위협 탐지** 가능해졌으며, 고객 만족도가 18% 상승했습니다.

---

# # 결론 – 지금 바로 PostgreSQL 보안을 한 단계 끌어올리세요

1️⃣ **에이전트 인증** 은 “비밀번호 하나만”으로는 방어할 수 없는 현대 사이버 위협에 대비하는 **핵심 방어선** 입니다.

2️⃣ **RLS + 토큰 검증** 으로 최소 권한 원칙을 데이터베이스 레이어까지 확장하면, 애플리케이션 코드 수정 없이도 강력한 보안을 적용할 수 있습니다.

3️⃣ **감사 로그** 와 **키 관리** 를 함께 운영하면, 보안 사고 발생 시 빠른 대응이 가능해집니다.

> **행동 유도** : 지금 바로 `pgcrypto` 확장을 설치하고, 간단한 JWT 검증 함수를 만들어 보세요. 그리고 **RLS 정책**을 적용해 테스트 환경에서 에이전트 인증을 실험해 보는 것을 추천합니다.

*데이터베이스 보안은 선택이 아니라 필수입니다. 오늘부터 PostgreSQL에 에이전트 인증을 도입해 해커에게 “당신은 여기서 멈춰야 합니다!” 라고 외쳐 보세요.*
