데이터 계층 보안 vs. 애플리케이션 계층 보안

업데이트: 2026년 11월

애플리케이션 계층 보안은 코드 안의 방어선이고 데이터 계층 보안은 데이터 자체에 걸린 방어선으로, 실제 시스템에는 둘 다 필수입니다. 두 용어는 동의어가 아닙니다. 검색 상위에 오르는 일부 용어집조차 둘을 뒤섞지만, 애플리케이션 계층은 동작(인증, 검증, 비즈니스 규칙)을 보호하고 데이터 계층은 저장된 정보(정책, ACL, 암호화)를 모든 경로로부터 보호합니다. 코드가 결코 보지 못하는 경로까지 포함해서입니다.

핵심 요약

질문답변
애플리케이션 계층코드 안의 규칙: 인증, 검증, 워크플로 인가
데이터 계층데이터에 걸린 규칙: 정책, ACL, 암호화, 감사. 모든 접근 경로에 적용
전형적인 실패엔드포인트 하나가 소유권 검사를 빠뜨림. IDOR, OWASP 1위
원칙심층 방어: 계층마다 실패 방식이 다르므로 겹쳐 쌓음
배치 규칙워크플로 규칙은 코드에, 구조적 규칙은 데이터에

논쟁을 정의하는 버그

애플리케이션 계층에서의 강제도 올바르게 동작합니다. 누군가 엔드포인트마다 같은 검사를 반복하는 것을 잊기 전까지는 말입니다:

// 엔드포인트 1: 소유권 검사가 제자리에, 올바르게 있음
app.get('/contracts/:id', async (req, res) => {
  const contract = await db.contracts.findById(req.params.id);
  if (contract.ownerId !== req.user.id) return res.status(403).end();
  res.json(contract);
});

// 엔드포인트 2, 세 스프린트 뒤 다른 파일에서:
app.get('/contracts/:id/export', async (req, res) => {
  const contract = await db.contracts.findById(req.params.id);
  res.send(toPdf(contract));   // ← 아무도 검사를 다시 쓰지 않음. IDOR가 배포됨.
});

데이터 계층의 강제는 실패의 방향을 뒤집습니다. 규칙이 행과 함께 다니므로, 검사를 잊을 여지 자체가 없습니다:

// JavaScript / Node.js — Back4app JS SDK
// Data-layer enforcement: the rule travels with the row, not the code path
const doc = await new Parse.Query('Contract').get(contractId); // someone else's row
doc.set('total', 0);
try {
  await doc.save(); // rejected by the object's ACL — server-side, every path
} catch (e) {
  console.log(e.code); // 101: object not found for update
}

심층 방어: 저장된 데이터를 둘러싼 보안 계층

저장된 데이터를 둘러싼 심층 방어요청은 네트워크 방어를 지나 인증, 검증, 비즈니스 인가 같은 애플리케이션 계층 통제를 거친 뒤 마지막으로 정책, ACL, 암호화 같은 데이터 계층 통제에 도달합니다. 데이터 계층 통제는 애플리케이션을 완전히 우회하는 경로까지 포괄합니다.

네트워크 계층
TLS, 방화벽, 게이트웨이

애플리케이션 계층
인증 · 검증 · 워크플로 인가

데이터 계층
정책 · ACL · 암호화 · 감사

우회 경로:
관리용 SQL, BI 도구, 작업, 두 번째 서비스

요청은 네트워크 방어를 지나 인증, 검증, 비즈니스 인가 같은 애플리케이션 계층 통제를 거친 뒤 마지막으로 정책, ACL, 암호화 같은 데이터 계층 통제에 도달합니다. 데이터 계층 통제는 애플리케이션을 완전히 우회하는 경로까지 포괄합니다.

점선 화살표가 곧 논거입니다. 애플리케이션을 건너뛰는 모든 것도 결국 데이터 계층에는 닿습니다. 그래서 컨트롤러에만 있는 규칙은 문이 여러 개인 방에서 문 하나만 지키는 셈입니다. 이것이 스토리지에 적용한 심층 방어이며, 서로 다르게 실패하는 방어벽을 겹쳐 두는 것입니다.

데이터 계층 vs. 애플리케이션 계층: 누가 무엇을 하는가

기능애플리케이션 계층데이터 계층
인증세션, 토큰, 로그인 흐름전파된 ID를 신뢰
입력 검증첫 번째이자 주된 방어선최후의 방어선인 타입과 제약 조건
워크플로 인가”이 역할이 지금 이 작업을 해도 되는가?”부적합. 여기에 두지 않음
구조적 인가편의를 위한 검사정책, ACL: 강제되는 벽
암호화키 분리를 위한 앱 수준 암호화저장 데이터 암호화와 필드별 암호화
감사비즈니스 이벤트모든 접근, 모든 경로

논쟁을 좌우하는 것은 두 행입니다. 워크플로 규칙(승인 체인, 상태 머신, 한도)에는 코드만 가진 컨텍스트가 필요하며, 이를 행 조건식에 억지로 넣으면 유지보수할 수 없는 정책 덩어리가 됩니다. 구조적 규칙(소유권, 테넌시, 가시성)은 정확히 행 정책과 객체별 ACL이 엔드포인트마다 규율을 지키지 않아도 강제해 주는 대상입니다. 각 규칙은 실패하더라도 감당할 수 있는 곳에 두어야 합니다.

IDOR: CVE 목록이 딸린 계층 논쟁

가장 높은 순위의 접근 제어 실패이자 API 전용 목록의 1위는 바로 위 코드의 잊힌 검사입니다. 인증된 사용자가 객체별 인가 없이 ID로 객체를 가져오는 것입니다. 보안 문서는 취약점을 정리하고 아키텍처 문서는 계층을 정리하지만, 쓸모 있는 부분은 둘의 연결입니다. IDOR는 애플리케이션 전용 강제가 대규모로 드러난 모습이고, 데이터 계층 정책은 그 구조적 해법입니다. 놓친 검사가 열린 상태가 아니라 닫힌 상태로 실패(fail closed)하기 때문입니다.

BaaS가 경계를 옮기는 방식

Backend-as-a-Service 플랫폼은 이 글의 논지를 아키텍처로 구현합니다. 클라이언트가 데이터 서비스와 (거의) 직접 통신하므로 검사를 담을 손으로 작성한 컨트롤러 계층이 없고, 따라서 인가는 데이터 계층 구성 요소에 있어야만 합니다. 객체별 ACL이 소유권을 담고, 클래스 수준 권한이 스키마별로 작업을 통제하며, 플랫폼은 모든 표면에서 들어오는 모든 요청에 둘 다 강제합니다. 애플리케이션 계층이 사라지는 것은 아닙니다. 검증과 워크플로 규칙을 담는 서버 측 함수로 자리를 옮길 뿐입니다. 규율이 아니라 설계로 강제되는 두 계층 분리입니다.

일반적인 사용 사례

  • 멀티테넌트 SaaS. 테넌시는 대표적인 구조적 규칙입니다. 데이터 계층에서 강제하고, 공격자의 관점으로 테스트하며, 결코 WHERE 절에 맡기지 않습니다.
  • 사용자 소유 레코드. 메시지, 문서, 주문은 ACL로 소유권을 행에 둡니다. 애플리케이션 코드는 읽기 쉽게 유지되고 데이터는 봉인된 채로 남습니다.
  • 분석과 BI 접근. 우회 경로를 안전하게 만든 경우입니다. 분석가는 복제본에 직접 쿼리하고 데이터 계층 규칙이 허용하는 것만 봅니다.
  • 규정 준수 증거. 감사인은 애플리케이션 코드를 가리키는 설명보다 데이터 계층에서 입증할 수 있는 통제를 선호합니다.
  • 승인 워크플로. 반대 사례입니다. 상태에 따라 달라지는 비즈니스 규칙은 애플리케이션 로직에 두고, 구조적 규칙은 그 아래에서 여전히 유지됩니다.

각 규칙은 어디에 두어야 할까? 결정 매트릭스

애플리케이션 코드에 두어야 하는 경우…데이터 계층에 두어야 하는 경우…
규칙에 워크플로 컨텍스트나 상태가 필요함규칙이 소유권, 테넌시, 가시성에 관한 것임
여러 서비스와 부수 효과에 걸쳐 있음우회 경로를 포함한 모든 경로에서 유지되어야 함
제품을 반복 개선할 때마다 바뀜실패가 버그가 아니라 침해를 뜻함
풍부한 오류 메시지와 UX 흐름이 중요함조용히 닫힌 상태로 실패하는 것이 바람직함
비즈니스 정책임구조적 불변 조건임

그리고 두 열 모두에 걸친 상시 규칙이 있습니다. 계층은 OR가 아니라 AND입니다. 명확성과 UX를 위해 애플리케이션 계층의 검사를 유지하고, 그 검사가 빠지더라도 데이터 계층이 버텨 주도록 해야 합니다.

한계와 트레이드오프

  • 애플리케이션 전용 강제: 엔드포인트마다 로직이 중복되고, 마이크로서비스 사이에서 규칙이 어긋나며, 모든 우회 경로가 무방비로 남습니다. IDOR를 찍어 내는 공장입니다.
  • 데이터 전용 강제: 디버깅하는 사람을 당혹스럽게 하는 보이지 않는 규칙, 행마다 평가하는 비용, 풀링 컨텍스트의 미묘함, 조건식에 억지로 끼워 맞춘 비즈니스 로직이 문제가 됩니다.
  • 둘을 함께 쓰면 조율 비용이 듭니다. 규칙이 바뀌면 고칠 곳이 두 군데입니다. 구조적 규칙은 적고 안정적이며 문서화된 상태로 유지해야 합니다.
  • 암호화 위치는 실제 갈림길입니다. 데이터베이스 측 암호화는 투명하고 검색이 가능하며, 애플리케이션 측 암호화는 키를 분리하지만 쿼리를 복잡하게 만듭니다. 필드별로, 위협별로 결정해야 합니다.
  • 경계 자체도 감사해야 합니다. 우회 자격 증명(관리자 역할, 마스터 키)을 가진 사람은 모든 방어선 바깥에 서 있습니다. 그 목록이 실제 경계입니다.

Back4app에서의 두 계층

Back4app은 관리형 데이터베이스, 자동 생성되는 REST 및 GraphQL API, 인증, 파일 스토리지, Cloud Code 서버리스 함수를 결합한 오픈소스 Backend as a Service(BaaS) 플랫폼입니다. Back4app은 이 글의 결론을 기본 아키텍처로 제공합니다. 데이터 계층은 구조적 규칙(객체별 ACL, 클래스 수준 권한, 보호 필드)을 담아 모든 요청에서 서버 측으로 강제하고, Cloud Code 트리거는 애플리케이션 계층의 몫인 검증, 데이터 보강, 워크플로 검사를 맡아 쓰기가 반영되기 전에 실행합니다. 필터를 잊는 버그가 빠져나갈 길은 없고, 비즈니스 규칙에는 여전히 머물 자리가 있습니다.

자주 묻는 질문

애플리케이션 계층 보안과 데이터 계층 보안의 차이는 무엇입니까?

애플리케이션 계층은 동작을 보호합니다. 인증, 세션 처리, 입력 검증, 코드에 작성한 비즈니스 로직 검사가 여기에 속합니다. 데이터 계층은 저장된 정보 자체를 보호합니다. 어떤 클라이언트나 코드 경로가 데이터에 닿든 유지되는 암호화, 접근 정책, 행 수준 규칙, 감사가 여기에 속합니다. 둘은 별개의 계층입니다. 일부 용어집은 둘을 뒤섞는데, 빈틈은 바로 그렇게 생깁니다.

데이터베이스가 애플리케이션 뒤에 있다면 애플리케이션 보안만으로 충분합니까?

아닙니다. 이 주제를 진지하게 다루는 모든 자료가 여기에 동의합니다. 애플리케이션 로직을 거치지 않고 데이터베이스에 닿는 모든 것은 그곳에 작성된 규칙을 전부 우회합니다. 관리용 SQL 클라이언트, BI와 분석 도구, 백그라운드 작업, 마이그레이션, 데이터베이스를 공유하는 두 번째 서비스가 그렇습니다. 애플리케이션 계층의 규칙은 문 하나를 지키고, 데이터 계층은 방 전체를 지킵니다.

인가는 애플리케이션 코드와 데이터베이스 중 어디에서 강제해야 합니까?

규칙 유형에 따라 계층별로 나눕니다. 컨텍스트가 풍부한 비즈니스 규칙("매니저는 자기 한도 이하의 청구서만 승인")은 워크플로와 가까운 애플리케이션 코드에 둡니다. 구조적 규칙("사용자는 자신의 행만 조회", "테넌트 간 경계는 절대 넘지 않음")은 데이터 계층, 즉 엔드포인트마다 잊어버릴 수 없는 정책이나 ACL에 둡니다. 클라이언트 측에는 절대 두지 않습니다. 성숙한 답은 어느 한쪽 편을 드는 것이 아니라 배치입니다.

IDOR란 무엇이며 어느 계층이 이를 막습니까?

안전하지 않은 직접 객체 참조(Insecure Direct Object Reference)입니다. 호출자가 접근할 수 있는지 확인하지 않고 ID로 객체를 가져오는 것으로, OWASP 목록에서 가장 높은 순위에 오른 API 취약점 유형입니다. 즉각적인 해결책은 모든 엔드포인트에 애플리케이션 계층의 소유권 검사를 두는 것이고, 구조적 해결책은 데이터 계층에서 강제하는 것입니다. 이 경우 행 자체가 인가되지 않은 접근을 거부하므로, 검사가 빠져도 접근이 거부되는 쪽으로 실패합니다(fail closed).

심층 방어란 무엇입니까?

어떤 단일 통제도 유일한 방어선이 되어서는 안 된다는 원칙입니다. 서로 겹치는 여러 방어벽을 두어 한 계층의 실패를 다음 계층이 잡아냅니다. 여기에 적용하면, 애플리케이션에서 검증하고 인가하되 데이터 계층에서도 접근을 한 번 더 강제하는 것입니다. 계층들은 중복이 아닙니다. 서로 다르게 실패하며, 바로 그것이 핵심입니다.

데이터는 애플리케이션 계층과 데이터베이스 계층 중 어디에서 암호화해야 합니까?

위협 모델에 따라 다르며, 둘 다인 경우가 많습니다. 데이터베이스 수준의 저장 데이터 암호화는 도난당한 디스크와 백업을 보호하지만, 애플리케이션이 침해되면 아무런 보호가 되지 않습니다. 애플리케이션 계층 암호화는 키를 데이터베이스에서 완전히 떼어 두어 데이터베이스 측 침해를 막지만, 그 대가로 검색 가능성을 잃습니다. 전송 중 데이터의 암호화는 모든 구간에서 기본 요건입니다.

데이터베이스에서 보안을 강제할 때의 단점은 무엇입니까?

실재하는 단점이며, 부정하기보다 관리해야 합니다. 정책은 애플리케이션 코드에서 보이지 않으므로 "내 행은 어디로 갔는가"를 디버깅하려면 규율이 필요합니다. 행마다 정책을 평가하는 데는 성능 비용이 따릅니다. 세션 기반 테넌트 컨텍스트는 커넥션 풀링과 미묘하게 상호작용합니다. 그리고 복잡한 비즈니스 워크플로는 행 조건식으로 잘 표현되지 않습니다. 구조적 규칙은 그곳에서 제 몫을 하지만 워크플로 규칙은 그렇지 않습니다.

BaaS 플랫폼은 보안이 위치하는 곳을 어떻게 바꿉니까?

신뢰할 수 있는 중간 계층을 없앱니다. 클라이언트가 데이터 서비스와 거의 직접 통신하므로, 인가는 손으로 작성한 컨트롤러 검사 대신 데이터 계층 구성 요소, 즉 객체별 ACL, 클래스 수준 권한, 행 정책에 있어야 합니다. 이는 약점이 아니라 모델 그 자체입니다. 플랫폼이 선언된 규칙을 모든 요청에 강제하고, 서버 측 함수가 나머지 비즈니스 로직을 담당합니다.

관련 용어

비교 대상

참고 자료

백엔드를 구축할 준비가 되셨나요?

몇 분 안에 Back4app에서 프로젝트를 시작하세요. 데이터베이스, 인증, API, Cloud Code가 포함되어 있으며 신용카드는 필요 없습니다.

작성 및 검수: Back4app Engineering, Back4app Engineering · 게시일 2026-11-02