클래스 수준 권한(CLP)이란?

업데이트: 2026년 10월

클래스 수준 권한(CLP)은 어떤 사용자나 역할이 해당 클래스에서 각 작업을 애초에 실행할 수 있는지를 통제하는, 클래스 스키마 단위의 규칙입니다. CLP는 데이터 계층 보안의 가장 바깥쪽 관문입니다. 행 단위 검사가 일어나기 전에, 클래스 자체가 이 호출자가 여기서 find, create, update, delete를 할 수 있는지 결정합니다. 규칙 하나가 테이블 전체에 적용되며, 가장 먼저 검사됩니다.

핵심 요약

질문답변
정의클래스(테이블) 자체에 거는 작업별 접근 규칙
vs. ACLCLP는 클래스 관문, ACL은 행 관문 · 요청은 두 관문 모두 통과 필수
작업find, get, count, create, update, delete, addField – 각각 따로 설정
황금 기본값인증 필수, addField 잠금, 마스터 키는 클라이언트에 절대 포함 금지
SQL의 친척테이블과 스키마에 대한 GRANT/REVOKE – 같은 개념, 다른 문법

클래스 관문: 선언과 체감

CLP는 스키마 설정입니다. 다음은 Config 클래스를 public read, 서버 전용 쓰기로 잠그는 REST 페이로드입니다.

PUT /schemas/Config
{
  "classLevelPermissions": {
    "find":   { "*": true },              // 누구나 쿼리 가능
    "get":    { "*": true },
    "create": {},                         // 클라이언트 측에서는 누구도 불가
    "update": { "role:admin": true },     // 관리자만
    "delete": {},
    "addField": {}                        // 스키마 동결
  }
}

클라이언트 쪽에서는 관문이 제 역할을 하는 모습이 그대로 드러납니다. 읽기는 통과하고, 쓰기는 어떤 데이터에도 닿기 전에 클래스 경계에서 막힙니다.

// JavaScript / Node.js — Back4app JS SDK
// The class gate in action: Config is read-only for clients (CLP),
// so reads succeed and writes never reach the data
const config = await new Parse.Query('Config').first(); // ✓ public read

const c = new Parse.Object('Config');
c.set('flag', true);
try {
  await c.save(); // ✗ CLP blocks client writes to this class entirely
} catch (e) {
  console.log(e.code); // 119: operation forbidden by class-level permissions
}

클래스 수준 권한과 ACL이 함께 동작하는 방식

클래스 수준 권한과 ACL이 결합되는 방식모든 요청은 먼저 해당 작업에 대한 클래스 수준 권한 관문을 통과합니다. 클래스가 허용한 경우에만 객체별 ACL이 참조되며, 두 관문 중 어느 쪽이든 요청을 거부할 수 있습니다.

아니요

예

아니요

예

요청:
클래스 C의 객체 X 업데이트

클래스 관문(CLP):
이 호출자가 클래스 C를
update할 수 있는가?

거부 – 119

객체 관문(ACL):
이 호출자가 객체 X에
쓸 수 있는가?

거부 – 객체 숨김

허용

모든 요청은 먼저 해당 작업에 대한 클래스 수준 권한 관문을 통과합니다. 클래스가 허용한 경우에만 객체별 ACL이 참조되며, 두 관문 중 어느 쪽이든 요청을 거부할 수 있습니다.

세분성의 사다리: CLP vs. ACL vs. 포인터 권한 vs. 보호 필드

메커니즘범위선언 위치검사 시점대표적인 용도
클래스 수준 권한클래스 전체, 작업별스키마첫 번째”클라이언트의 Config 쓰기 금지”
포인터 권한(pointer permissions)객체별, 스키마 규칙을 통해스키마(필드 기준)두 번째”owner만 자신의 행에 접근”
ACL객체별각 행에 데이터로두 번째”이 메모는 작성자만”
보호 필드(protected fields)열별스키마읽기 시”다른 사용자에게 email 숨김”

여기서 도출되는 설계 원칙은 큰 틀은 스키마에, 세밀한 제어는 행에 두는 것입니다. 접근 규칙이 균일한 클래스(설정, 카탈로그, 로그)는 클래스 관문만으로 충분하고, 사용자별 데이터가 있는 클래스는 그 아래에 ACL이나 포인터 권한을 더합니다.

다른 엔진의 같은 관문

-- PostgreSQL: 테이블 수준 권한은 이름만 다른 CLP입니다
GRANT SELECT ON films TO PUBLIC;
GRANT INSERT, UPDATE ON films TO role_editor;
REVOKE ALL ON launch_codes FROM PUBLIC;

문서 데이터베이스는 컬렉션 수준 작업에 범위가 지정된 역할로 같은 구조를 구현합니다. 정확히 하나의 컬렉션에 대해 find와 insert를 부여받은 역할이 그 예입니다. 개념은 보편적이며, 다른 것은 사용 편의성입니다. SQL 권한 부여와 역할 문서는 코드로 관리하는 반면, BaaS 플랫폼은 같은 매트릭스를 대시보드 토글로 보여 줍니다.

콘텐츠 유형별 권장 설정

콘텐츠 유형Find/GetCreateUpdate/DeleteAdd field
공개 콘텐츠(카탈로그, 게시물)공개역할/서버역할/서버끔
사용자 소유 데이터(메모, 주문)인증 필수 + ACL인증 필수ACL 범위 내끔
설정과 플래그공개 또는 인증 필수불가(서버 전용)admin 역할끔
로그와 분석불가(서버 전용)인증 필수(쓰기 전용)불가끔
관리자 전용 데이터admin 역할admin 역할admin 역할끔

이 표는 대부분의 출시에 실제로 필요한 체크리스트입니다. 마지막 열이 항상 같다는 점과, 그와 짝을 이루는 규칙에 주목해야 합니다. 프로덕션에서는 클라이언트 측 클래스 생성을 꺼서, 스키마가 의도한 경우에만 바뀌게 해야 합니다.

일반적인 사용 사례

  • 프로덕션 스키마 동결. 모든 클래스에서 addField를 끕니다. 클라이언트 트래픽 때문에 클래스가 생기거나 구조가 바뀌는 일이 사라집니다.
  • 읽기 전용 참조 데이터. 카탈로그와 설정은 누구나 읽을 수 있고, 쓰기는 서버 코드만 할 수 있습니다. 위의 Config 패턴입니다.
  • 쓰기 전용 수신함. 피드백과 텔레메트리 클래스는 클라이언트가 생성만 할 수 있고 읽을 수는 없습니다. 애플리케이션 계층 코드가 자주 놓치는 역방향 관문입니다.
  • 역할별로 나뉜 관리 화면. 앱은 자유롭게 읽되, update와 delete는 admin 역할에만 허용합니다.
  • 고전적인 데이터 덤프 방어. 앱 ID 하나로 열려 있는 User 클래스를 조회하는 악명 높은 curl 한 줄짜리 명령은, 클래스가 인증을 요구하면 find 관문에서 막힙니다.

클래스 관문과 서버 코드 중 무엇으로 강제해야 할까? 결정 매트릭스

CLP(+ ACL)로 강제해야 하는 경우서버 코드를 거치게 해야 하는 경우
규칙이 “누가 어디서 무엇을 할 수 있는가”인 경우규칙에 비즈니스 로직이 필요한 경우(“주문 발송 전에만”)
규칙이 클래스별 또는 소유자별로 균일한 경우규칙이 여러 객체나 클래스에 걸치는 경우
새 클라이언트를 포함한 모든 경로에서 강제되어야 하는 경우민감한 워크플로에 감사 가능한 단일 진입점이 필요한 경우
리뷰에는 선언형이 명령형보다 나은 경우검증, 데이터 보강, 부수 효과가 함께 필요한 경우
대시보드 토글이 명세의 전부인 경우명세가 조건으로 가득한 한 문단인 경우

둘은 조합됩니다. 정말로 민감한 클래스를 위한 강화 패턴은 CLP를 완전히 잠그고 서버 측 함수만을 유일한 출입구로 노출하는 것입니다. 클래스 관문은 아무도 그 단일 진입점을 우회하지 못하도록 보장합니다.

한계와 트레이드오프

  • 클래스 단위는 정의상 굵은 단위입니다. 행 단위의 규칙은 ACL과 포인터 권한의 몫이고, 조건부 규칙은 서버 측 검증의 몫입니다. CLP는 통제할 뿐 판단하지 않습니다.
  • 기본값은 개발에 맞게 관대합니다. 프로토타입이 빠르게 진행되도록 새 클래스는 열린 상태로 생성됩니다. 출시 전에 위의 표대로 설정을 바꾸는 작업은 자동으로 일어나지 않으며, 규율의 문제입니다.
  • 마스터 키는 모든 것을 무시합니다. 이 키가 닿는 곳에서는 이 글의 모든 관문이 무력화됩니다. 그래서 마스터 키는 서버 측에만 두고, 작업 단위로 사용하며, 클라이언트에는 절대 포함하지 않습니다.
  • 강제 범위에 빈틈이 없어야 합니다. 실시간 구독과 특수 엔드포인트에는 과거에 강제의 빈틈이 있었습니다. 플랫폼을 최신 상태로 유지하고, 대시보드만이 아니라 실제 클라이언트에서 관문을 테스트해야 합니다.
  • 토글도 리뷰가 필요합니다. 선언형 보안은 누군가 감사할 때에만 감사 가능한 보안이 됩니다. 설정 매트릭스는 몇몇 사람의 기억이 아니라 출시 체크리스트에 있어야 합니다.

Back4app에서의 CLP

Back4app은 관리형 데이터베이스, 자동 생성되는 REST 및 GraphQL API, 인증, 파일 스토리지, Cloud Code 서버리스 함수를 결합한 오픈소스 Backend as a Service(BaaS) 플랫폼입니다. 클래스 수준 권한은 Back4app의 스키마 보안을 시각화한 것입니다. 대시보드의 모든 클래스가 작업 매트릭스를 체크박스로 제공합니다. 공개, 인증 필수, 역할별 설정에 더해 포인터 권한과 보호 필드까지 있으며, 이 모든 것이 SDK, REST, GraphQL을 가리지 않고 모든 요청마다 서버 측에서 강제됩니다. 그 아래에는 객체별 ACL이 있고, 그 위에는 로직이 필요한 규칙을 위한 Cloud Code 트리거가 있습니다. 보안 가이드라인은 출시 전 점검 전체를 안내합니다. 이 글의 설정 매트릭스를 클릭 하나하나로 적용하는 과정입니다.

자주 묻는 질문

클래스 수준 권한이란 무엇입니까?

클래스(테이블/컬렉션) 스키마에 연결된 규칙으로, 어떤 사용자나 역할이 그 클래스의 객체에 대해 각 작업(find, get, count, create, update, delete, addField)을 수행할 수 있는지 통제합니다. 가장 큰 단위의 접근 관문이자 가장 먼저 검사되는 관문입니다. 클래스 수준 규칙이 작업을 거부하면 객체별 권한은 아예 참조되지 않습니다.

CLP와 ACL의 차이는 무엇입니까?

범위와 순서입니다. CLP는 "누가 이 클래스에 애초에 접근할 수 있는가"에 답하며, 테이블 전체에 규칙 하나가 적용됩니다. ACL은 "누가 이 특정 행에 접근할 수 있는가"에 답하며, 각 객체가 데이터로 지니고 있습니다. 요청은 두 관문을 모두 통과해야 합니다. 클래스 관문이 먼저이고 객체 관문이 그다음이며, 어느 쪽이든 요청을 거부할 수 있습니다. 큰 틀은 클래스 수준에서, 세밀한 제어는 객체 수준에서 처리합니다.

requiresAuthentication이란 무엇입니까?

공개와 역할 나열 사이의 중간 설정입니다. 특정 사용자나 역할을 지정하지 않고, 유효한 세션을 가진 로그인 사용자라면 누구나 작업을 수행할 수 있도록 제한합니다. 대부분의 앱 데이터에 적합한 기본값입니다. 익명 요청은 거부되고, 인증된 사용자는 모두 클래스 관문을 통과해 객체별 ACL 검사로 넘어갑니다.

포인터 권한(pointer permissions)이란 무엇입니까?

객체의 사용자 Pointer 필드를 기준으로 하는 클래스 수준 규칙입니다. 예를 들어 "owner 필드에 지정된 사용자만 읽고 쓸 수 있다" 같은 규칙입니다. 가상의 ACL처럼 동작합니다. 강제는 객체별로 이루어지지만, 규칙은 모든 행에 저장되는 대신 스키마에 한 번만 선언됩니다. 실제 ACL과는 교집합으로 적용되므로 둘 다 해당 동작을 허용해야 합니다.

보호 필드(protected fields)란 무엇입니까?

클래스 관문 위에 얹히는 필드 수준 규칙입니다. 이메일 주소나 내부 점수 같은 특정 열을 일부 요청자에게 숨기고, 객체의 나머지는 읽을 수 있게 둡니다. 이로써 하나의 스키마 위에서 권한 사다리가 세 단으로 구성됩니다. 클래스 전체의 작업, 객체별 접근, 필드별 가시성입니다.

클래스 수준 권한에 해당하는 SQL 기능은 무엇입니까?

테이블 및 스키마 권한입니다. 테이블에 대해 역할에 GRANT SELECT, INSERT, UPDATE, DELETE를 부여하고 REVOKE로 회수하며, 스키마 수준의 USAGE와 CREATE 권한도 있습니다. 개념이 일대일로 대응합니다. 테이블 수준 GRANT는 문법만 다른 클래스 수준 권한이며, 문서 데이터베이스는 컬렉션 수준 작업에 범위가 지정된 역할로 같은 구조를 구현합니다.

프로덕션에서 클라이언트가 필드를 추가하거나 클래스를 생성하도록 허용해야 합니까?

아닙니다. 이는 모두가 동의하는 보안 강화 단계입니다. 스키마의 유연성은 개발 편의 기능입니다. 프로덕션에서는 모든 클래스에서 addField 권한을 끄고 클라이언트의 클래스 생성을 완전히 비활성화하여, 클라이언트에 대해 스키마를 동결해야 합니다. 그러면 스키마 변경은 본래 있어야 할 곳인 대시보드나 서버 측 코드를 통해서만 이루어집니다.

클래스 수준 권한만으로 앱을 보호할 수 있습니까?

CLP는 첫 번째 계층일 뿐 방어의 전부가 아닙니다. 표준적인 구성은 다음과 같습니다. CLP가 클래스별로 작업을 통제하고, ACL이나 포인터 권한이 행의 범위를 정하며, 보호 필드가 민감한 열을 숨기고, 서버 측 트리거가 쓰기를 검증합니다. 그리고 무엇보다 중요한 규칙이 하나 있습니다. 모든 관문을 우회하는 마스터 키는 절대 클라이언트 코드에 포함되어서는 안 됩니다.

관련 용어

비교 대상

참고 자료

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

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

작성 및 검수: Back4app Engineering, Back4app Engineering · 게시일 2026-10-30