파이어베이스(Firebase)는 NoSQL 데이터베이스로, SQL인젝션 공격에 대해 안전한 구조를 가지고 있습니다.
SQL인젝션 공격이 이루어지는 방식과 데이터베이스의 유형에 따른 파이어베이스는 SQL인젝션 공격으로부터 어떻게 안전한지 살펴보겠습니다.
SQL인젝션이란 무엇인가?
SQL 인젝션은 공격자가 악의적인 SQL 코드를 삽입하여 데이터베이스에 대한 무단 접근, 수정 또는 삭제를 시도하는 공격기법입니다. 이러한 문제는 개발자가 SQL 명령어를 동적으로 생성할 때, 입력값을 제대로 필터링하지 않으면 발생할 수 있습니다.
-- 사용자가 입력한 사용자 ID를 사용하여 사용자 정보를 조회하는 SQL 쿼리
SELECT * FROM users WHERE user_id = '사용자 입력값';
이 코드에서는 '사용자 입력값' 부분이 사용자가 입력한 데이터로 대체됩니다.
문제는 이러한 동적쿼리를 사용한다면 사용자가 악의적인 데이터를 입력할 때 문제가 발생할 수 있습니다.
#사용자 입력
' OR '1'='1
#최종 쿼리
SELECT * FROM users WHERE user_id = '' OR '1'='1';
'사용자 입력값'에 사용자가 ' OR '1'='1 을 삽입하여 최종적인 쿼리가 다음과 같다면, 이 쿼리는 'users'테이블의 모든 레코드를 반환하여 민감한 데이터가 유출될 수 있습니다.
SELECT * FROM users WHERE user_id = '123';
이러한 문제를 예방하기 위해서는 SQL 쿼리 문자열이 코드에 하드코딩되어 있으면 실행 시점에서 변하지 않습니다.
정적쿼리가 아닌 동적인 쿼리를 안전하게 실행하는 방법도 있는데, 일반적으로는 'Prepared Statemnets'와 'Parameterized Queries'를 사용하여 쿼리를 미리 컴파일하고 변수를 바인딩하여 실행하는 방법이 있습니다.
// 사용자 입력값 (예: 사용자가 입력한 userId)
const userId = '123';
// Prepared Statement를 사용하여 안전하게 쿼리 실행
const query = 'SELECT * FROM users WHERE user_id = ?';
SQL 데이터베이스와 NoSQL데이터베이스
SQL데이터베이스의 예
SQL 데이터베이스에서는 데이터를 조회하기 위해 SQL 쿼리를 작성해야 합니다.
이는 텍스트 문자열로 작성되어, 동적 쿼리를 작성할 때 사용자 입력값을 직접 쿼리에 포함시키는 경우 SQL 인젝션 공격에 취약할 수 있습니다.
SELECT * FROM users WHERE user_id = '2024';
이 쿼리는 'user' 테이블에서 'user_id'가 '2024'인 사용자의 모든 정보를 가져옵니다.
NoSQL 데이터베이스의 예
파이어베이스와 같은 NoSQL 데이터베이스는 데이터가 테이블이 아닌 JSON 구조로 저장됩니다.
데이터를 조회하거나 조작하기 위해 SQL 쿼리 문자열 대신 안전한 API를 사용하기 때문에 SQL 인젝션 공격으로부터 안전합니다.
const userId = '2024';
database.ref(`users/${userId}`).once('value').then(snapshot => {
const userData = snapshot.val();
console.log(userData);
});
// 안전하게 'users/2024' 경로의 데이터만 조회
이 코드를 살펴보면 userId가 2024일 때 database.ref('users/2024')는 해당 경로의 데이터를 안전하게 조회합니다.
파이어베이스 데이터 접근제어
파이어베이스가 SQL 인젝션에 안전하다고 해서 모든 보안 문제가 해결되지는 않습니다. 개발자는 파이어베이스 인증(Authentication)과 보안 규칙(Secuirty Rules)을 사용하여 사용자가 접근할 수 있는 데이터의 범위를 제한해야 합니다. 예를 들어, 특정 사용자가 자신의 데이터만 접근할 수 있도록 규칙을 설정하거나, 인증된 사용자만 데이터베이스를 읽고 쓸 수 있도록 제한할 수 있습니다.
보안 규칙 설정 예시
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
위 규칙은 인증된 사용자만 데이터베이스에 접근하여 읽고 쓸 수 있도록 합니다.
이를 통해 권한이 없는 사용자의 접근을 방지할 수 있습니다.