열 수준 권한
민감한 열을 숨깁니다.
열 수준 권한은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
열 수준 권한이 중요한 이유
모든 사용자가 TABLE의 모든 열을 볼 수 있어야 하는 것은 아닙니다. 급여 열, 비밀번호 해시, 신용 카드 번호는 사용자 이름이나 이메일처럼 완전히 공개된 데이터와 같은 TABLE에 저장될 수 있습니다.
열 수준 권한을 사용하면 TABLE 전체가 아니라 특정 열에 access를 부여할 수 있으므로, 볼 이유가 없는 사용자에게 민감한 데이터가 표시되지 않도록 할 수 있습니다.
전체 TABLE에 GRANT
기본적으로 GRANT SELECT ON table은 ROLE이 모든 열을 읽을 수 있게 합니다. 공개 데이터에는 적합하지만, 민감한 열과 민감하지 않은 열이 섞인 TABLE에서는 문제가 될 수 있습니다.
아래 쿼리는 analyst ROLE에 급여와 SSN을 포함한 employees TABLE 전체를 읽을 수 있는 access를 부여합니다.
GRANT SELECT ON employees TO analyst;열 수준 GRANT 구문
PostgreSQL(및 표준 SQL)에서는 GRANT 문 안에 특정 열 이름을 나열할 수 있습니다. 구문은 다음과 같습니다:
GRANT privilege (col1, col2) ON table TO role;
아래 예에서는 analyst ROLE이 id, name, department만 읽을 수 있도록 권한을 부여합니다. salary나 ssn은 읽을 수 없습니다.
GRANT SELECT (id, name, department) ON employees TO analyst;열 권한 확인
PostgreSQL에서는 information_schema.column_privileges 뷰를 조회해 열 수준 권한을 확인할 수 있습니다. 이 뷰에는 어떤 권한을 어떤 열에 어떤 권한 수여자가 가지고 있는지가 나열됩니다.
SELECT grantee, table_name, column_name, privilege_type
FROM information_schema.column_privileges
WHERE table_name = 'employees'
ORDER BY grantee, column_name;필요한 열이 없을 때의 동작
ROLE이 access를 부여받지 않은 열을 읽으려고 하면 데이터베이스가 권한 거부 오류를 반환합니다. access가 허용된 열만 참조해야 성공합니다.
analyst에 id, name, department만 부여되었다고 가정하면, 아래의 첫 번째 쿼리는 실패하고 두 번째 쿼리는 성공합니다.
-- This will fail for analyst (no permission on salary):
-- SELECT id, name, salary FROM employees;
-- This succeeds:
SELECT id, name, department FROM employees;열 수준 UPDATE 권한
열 수준 제한은 UPDATE에도 적용됩니다. ROLE이 특정 열만 업데이트할 수 있도록 허용할 수 있습니다. 예를 들어 헬프데스크 ROLE이 사용자의 status는 업데이트할 수 있지만 email이나 password_hash는 변경할 수 없게 할 수 있습니다.
GRANT UPDATE (status) ON users TO helpdesk;
-- helpdesk can now run:
UPDATE users SET status = 'suspended' WHERE id = 42;뷰로 열 숨기기
또 다른 일반적인 방법은 안전한 열만 노출하는 뷰를 만든 다음 기본 TABLE 대신 뷰에 access를 부여하는 것입니다. 이 방법은 열 수준 GRANT를 지원하는 데이터베이스뿐 아니라 모든 데이터베이스에서 사용할 수 있습니다.
CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;
GRANT SELECT ON public_employees TO analyst;열 수준 access 취소
GRANT와 마찬가지로 열 목록과 함께 REVOKE를 사용해 특정 열에 대한 access를 제거할 수 있습니다. ROLE에 광범위한 TABLE 수준 access가 있었다면, 제한된 열 수준 access를 부여하기 전에 기존 access를 완전히 취소해야 할 수 있습니다.
-- Remove all SELECT on the table first
REVOKE SELECT ON employees FROM analyst;
-- Then grant only safe columns
GRANT SELECT (id, name, department) ON employees TO analyst;열 권한과 RLS 함께 사용하기
열 수준 권한과 행 수준 보안(RLS)은 서로 보완적입니다. RLS는 사용자가 볼 수 있는 행을 제어하고, 열 수준 권한은 해당 행에서 표시되는 열을 제어합니다.
두 가지를 함께 사용하면 2차원 access 제어를 구성할 수 있습니다. 행 집합을 제한하는 동시에 각 행의 민감한 필드를 숨길 수 있습니다.
-- RLS policy: employees can see only their own row
CREATE POLICY own_row ON employees
FOR SELECT
USING (user_id = current_user_id());
-- Column grant: hide salary even for own row
GRANT SELECT (id, name, department) ON employees TO employee_role;SECURITY DEFINER 함수 사용하기
단순한 열 목록을 넘어 세밀한 논리를 적용하려면 SECURITY DEFINER 함수가 중간 역할을 할 수 있습니다. 이 함수는 소유자의 권한으로 실행되며, 소유자는 모든 열에 access할 수 있습니다. 함수는 누가 호출하더라도 자신이 공개하도록 선택한 값만 반환합니다.
CREATE OR REPLACE FUNCTION get_employee_summary(emp_id INT)
RETURNS TABLE(id INT, name TEXT, department TEXT)
SECURITY DEFINER
LANGUAGE sql AS
$$
SELECT id, name, department
FROM employees
WHERE id = emp_id;
$$;
GRANT EXECUTE ON FUNCTION get_employee_summary(INT) TO analyst;실전 설계: 계층형 열 보안
견고한 운영 환경 패턴은 다음 세 계층을 결합합니다:
- TABLE 소유권 — 앱 서비스 계정만 기본 TABLE을 소유합니다.
- 뷰 또는 열 수준 GRANT — 읽기 ROLE에는 민감하지 않은 열에만 access를 부여합니다.
- 감사 열 — 트리거를 통해 어떤 사용자가 언제 민감한 데이터를 변경했는지 기록합니다.
이렇게 하면 한 계층에서 ROLE에 실수로 과도한 권한이 부여되더라도 다른 계층이 계속 데이터를 보호합니다.
-- Layer 1: revoke public access
REVOKE ALL ON employees FROM PUBLIC;
-- Layer 2: expose safe columns via view
CREATE VIEW employee_public AS
SELECT id, name, department, hire_date FROM employees;
GRANT SELECT ON employee_public TO reporting_role;
-- Layer 3: audit trigger logs sensitive field reads (pseudocode)
-- CREATE TRIGGER audit_salary AFTER SELECT ON employees ...빠른 확인
hr_viewer ROLE이 employees TABLE의 name과 department 열만 읽을 수 있도록 올바르게 권한을 부여하는 SQL 문은 무엇인가요?
요약: 열 수준 권한
열 수준 권한을 사용하면 TABLE 전체가 아니라 개별 필드에 대한 access를 제한할 수 있으므로, 급여, SSN, 비밀번호 해시와 같은 민감한 데이터가 권한이 없는 ROLE에 표시되지 않도록 할 수 있습니다.
핵심 내용:
GRANT SELECT (col1, col2) ON table TO role을 사용해 읽을 수 있는 열을 제한합니다.- 열 목록과 함께
REVOKE를 사용해 특정 열에 대한 access를 제거합니다. - 뷰는 모든 데이터베이스에서 사용할 수 있는 이식성 높은 대안입니다.
- 열 수준 권한과 RLS를 결합해 2차원 access 제어를 구성합니다.
- SECURITY DEFINER 함수는 추가 논리를 사용해 프로그래밍 방식으로 열 수준 필터링을 제공합니다.
열 수준 보안을 일관되게 적용하면 데이터 계층에서 최소 권한 원칙을 시행하는 가장 간단하고 효과적인 방법 중 하나가 됩니다.
자주 묻는 질문
“열 수준 권한” 강의는 무료인가요?
네 — “열 수준 권한” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“열 수준 권한”에서 뭘 배우나요?
민감한 열을 숨깁니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“열 수준 권한” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 역할과 권한
- 행 수준 보안 정책
- 열 수준 권한
- 접근 감사