[CS/데이터베이스] 데이터베이스 보안

선우·2025년 12월 26일

CS

목록 보기
14/20

[CS/데이터베이스] 06. 서비스의 생존을 결정하는 데이터베이스 보안

⚡ 한 줄 요약: 데이터베이스 보안은 외부의 벽을 세우는 것을 넘어, GRANT/REVOKE를 통한 최소 권한 원칙Prepared Statement를 이용한 SQL 인젝션 방어를 통해 내부 데이터를 보호하는 전략입니다.

1. 👋 들어가며: "보안은 인프라 팀만의 업무일까?"

API 명세서를 보며 input 값을 넘길 때, 우리가 만든 그 작은 입력창이 데이터베이스를 파괴하는 통로가 될 수 있다는 사실을 알고 계셨나요?

보안 사고는 거창한 해킹 툴보다 아주 사소한 쿼리 조작에서 시작되는 경우가 많습니다.

  • 🧐 Why:
    • 서비스의 신뢰도는 쌓는 데 수년이 걸리지만, 데이터 유출 한 번에 무너지는 건 한순간이기 때문입니다.
  • 🎯 Goal:
    • 데이터베이스 내부의 권한 관리 메커니즘을 이해하고, 실무에서 가장 빈번하게 발생하는 보안 위협인 SQL 인젝션의 원리와 완벽한 방어 기법을 습득합니다.

📂 2. 데이터베이스 보안

보안은 단순히 외부 침입을 막는 것을 넘어, 데이터베이스 내부의 데이터를 누가 어떻게 다룰 수 있는지 정의하고 악의적인 조작으로부터 보호하는 모든 활동을 의미합니다.

📌 2-1. 사용자 권한 관리 (GRANT & REVOKE)

우리가 흔히 보안을 이야기할 때 암호화나 방화벽 같은 외부 침입 차단 기술을 먼저 떠올립니다.

하지만 데이터베이스 안에도 반드시 챙겨야 할 보안 요소가 있는데, 그중 하나가 바로 사용자 권한입니다.

데이터베이스 시스템에는 다양한 사용자가 존재하며, 이들에게 적절한 권한을 부여하는 것이 보안의 첫걸음입니다.

  • 개념 정의

    • 어떤 사용자는 데이터를 읽기만 가능하게 하고, 어떤 사용자는 추가만 가능하게 하는 등 권한을 세분화해서 부여하는 것이 보안의 핵심입니다.
  • 권한 부여 (GRANT)

    • 사용자에게 특정 데이터베이스나 테이블에 대한 접근 권한을 주는 명령어입니다.

    • SELECT, INSERT, UPDATE, DELETE 등으로 권한을 아주 작게 쪼개서 줄 수 있습니다.

      • 예시 1
        GRANT SELECT, INSERT
        ON users
        TO ‘alice'@'192.168.0.10';
        • alice에게 users 테이블의 SELECT, INSERT 권한만 줍니다.
      • 예시 2
        GRANT ALL PRIVILEGES
        ON my_database.* TO ‘bob'@'localhost';
        • bob에게 특정 DB의 모든 권한(ALL PRIVILEGES)을 한 번에 줄 수도 있습니다.
  • 권한 회수 (REVOKE)

    • 이미 준 권한을 다시 뺏어오는 명령어입니다.
    • 잘못된 권한을 줬거나, 사용자가 더 이상 해당 작업이 필요 없을 때 보안 사고를 막기 위해 사용합니다.

📌 2-2. SQL 인젝션 방어

SQL 인젝션은 공격자가 입력창 등에 SQL 문을 직접 조작해 넣어 데이터베이스를 무단으로 조작하는 해킹 기법입니다.

  • 위험성

    • 비밀번호 확인 쿼리에 ' OR '1'='1' 같은 값을 넣어버리면, 1=1이 항상 참이 되어 비밀번호를 몰라도 관리자 권한을 획득하거나 민감한 정보를 유출할 수 있습니다.
  • 방어책 - Prepared Statement

    • 가장 확실한 방어 수단은 '준비된 쿼리'를 사용하는 것입니다.

    • SQL 문을 미리 준비해두고 사용자 입력값은 나중에 안전하게 연결(바인딩)하는 방식입니다.

    • 작동 원리

      • 사용자가 입력한 값이 쿼리에 직접 섞이지 않고 ? 자리에 안전하게 바인딩됩니다.
      • 특수문자나 쿼리 조작 문구가 들어와도 시스템은 이를 명령어가 아닌 단순한 '문자열'로 처리해버리기 때문에 공격이 먹히지 않습니다.

📌 2-3. 헷갈리기 쉬운 포인트 / 오해 정리

  • 보안은 인프라 팀에서 방화벽만 잘 세우면 되는 거 아닌가요?

    • 아닙니다. 애플리케이션 레벨에서 사용자 입력값을 제대로 처리하지 못해 발생하는 SQL 인젝션이나, 과도한 권한을 가진 계정이 탈취되는 사고는 방화벽만으로는 막을 수 없습니다.

    • 데이터베이스 내부의 권한 설계와 쿼리 작성 습관이 보안의 본질입니다.

📌 2-4. 한 줄 정리

  • 데이터베이스 보안의 핵심은 사용자 권한을 세분화하여 최소 권한만 부여하고, Prepared Statement를 사용해 입력값이 명령어로 실행되지 않도록 격리하는 것입니다.

🎁 3. 정리

🔑 요약

  • 최소 권한의 원칙

    • 모든 계정에 ALL PRIVILEGES를 주는 것은 도둑에게 마스터키를 맡기는 것과 같습니다.

    • GRANTREVOKE를 활용해 필요한 시점에 필요한 작업만 허용하는 꼼꼼함이 필요합니다.

  • 데이터와 명령의 격리

    • SQL 인젝션은 공격자의 입력값이 '명령어'로 오해받을 때 발생합니다.

    • Prepared Statement를 사용하면 입력값이 아무리 사악해도 단순한 '문자열'로 취급되므로 데이터베이스를 안전하게 지킬 수 있습니다.

  • 애플리케이션과 DB의 공동 책임

    • 보안은 방화벽이라는 물리적 장벽만으로 완성되지 않습니다.

    • 코드 레벨에서 쿼리 작성 습관과 정교한 권한 설계가 결합되어야만 비로소 '뚫리지 않는 서비스'가 완성됩니다.

0개의 댓글