본문 바로가기
프로그래밍/Web Basic

클라이언트와 DB 직접 연결하면 안 되는 이유

by YuminK 2023. 11. 11.

클라이언트와 DB를 연결하는 것은 어렵지 않다. 기술적으로 불가능한 것은 아니지만, 일반적인 어플리케이션을 개발할 때 사용하지 않는 방식이다. 

 

클라이언트와 DB 연결의 종류

1. 클라이언트와 로컬 DB

2. 클라이언트와 DB 연결

3. 클라이언트와 서버 연결

 

주로 사용되는 형태는 1번과 3번이다. 

서버와 통신하지 않는 앱을 만드는데 Database를 사용하고 싶다면 SQLite 같은 로컬 DB를 사용하면 된다. 

이는 우리 앱이 단순히 자신의 정보를 저장하기 위한 목적으로 DB를 사용한다는 것을 의미한다.

 

나만의 Todo앱? 나만 사용하는 메모장? 같은 걸 만드는데 사용하면 된다.

 

만약 서버와 통신하고 싶다면 2번과 3번의 방식이 존재한다.

그렇다면 왜 3번의 방식을 주로 선택하는 것일까?

 

1. 보안상의 이슈

클라이언트와 DB를 직접 연결한다는 것은 DB의 접근 주소나 계정 정보가 클라이언트 코드에 들어간다는 것을 의미한다. 클라이언트에서 난독화를 했다고 하더라도, 해커의 공격에 의해 소스가 노출될 가능성이 높다. 만약 DB를 완전히 날리는 코드를 작성하여 실행시킨다면 우리 DB는 어떻게 될까? 

 

2. 데이터의 무결성

클라이언트가 보내는 정보는 신뢰할 수 없다. 서버는 클라이언트가 보낸 정보를 DB에 넣기 전에 한번 더 검증한다. 클라이언트가 보내는 모든 정보를 검증없이 DB에 넣는다는 것은 잘못된 데이터를 넣을 가능성이 있다.

 

순수한 개발자 A는 이렇게 말할 수도 있다.

"아니 프론트엔드 개발자가 데이터 잘 검증해서 넣어주면 문제 안 생기는 거 아니에요?"

 

문제가 안 생길 수도 있다. 근데 서버는 클라이언트가 보낸 데이터를 신뢰하지 않는 것이 기본이다. 악의적인 목적을 가진 해커가 검증되지 않은 정보를 보낼 가능성도 존재한다. 혹은 사용자의 실수로 잘못된 데이터가 들어올 가능성도 있다. 아니면 정말로, 프론트엔드 개발자가 무결성 체크를 안 해서 보낼 수도 있다.

 

이렇게 보낸 데이터를 검증하지 않고 DB에 넣는다는 것은 안일한 생각이다. 프론트, 백 상관없이 이중으로 확인 하는 것이 기본이다. DB에 데이터를 적재하기 전 최후의 보루로서 서버는 존재해야만 한다.

 

배민 기술 블로그의 다음 글을 참고해보자. (사용자는 실수한다, 사용자의 입력은 무조건 검증한다)
https://techblog.woowahan.com/2645/


 

그렇다면 왜 Firebase는 클라이언트와 DB를 직접적으로 연결하는 것일까? 문제가 없는 방식일까? 

앞서 말한대로 클라이언트와 DB를 직접 연결하지 않는 이유는 보안과 무결성 때문이다.

 

Firebase의 경우, 보안과 데이터 무결성을 검증할 수 있는 시스템이 이미 존재한다.

 

Firebase의 공식 문서에 따르면, Firebase Auth에서 자체 백엔드 서버를 이용하여 인증을 처리해주고 있다고 한다. 또한 인증을 마친 사용자는 데이터베이스에 접근하여 데이터를 읽고 쓸 수 있다고 되어 있다.

 

그렇다면 악의적인 목적을 가진 해커 혹은 잘못된 데이터를 입력한 클라이언트의 데이터를 어떻게 제어할 수 있을까? Firebase 실시간 데이터베이스 보안 규칙 문서를 보면 알 수 있다. 

 

"Firebase 실시간 데이터베이스 보안 규칙은 데이터베이스에 대한 읽기 및 쓰기 권한이 있는 사용자, 데이터의 구조 및 색인 생성 여부를 결정합니다. 이 규칙은 Firebase 서버에 상주하며 항상 자동으로 적용됩니다. 모든 읽기 및 쓰기 요청은 규칙에 따라 허용될 때만 완료됩니다."

 

규칙 유형

.read 사용자가 데이터를 읽을 수 있는 조건을 기술합니다.
.write 사용자가 데이터를 쓸 수 있는 조건을 기술합니다.
.validate 값의 올바른 형식, 하위 속성을 갖는지 여부 및 데이터 유형을 정의합니다.
.indexOn 정렬 및 쿼리를 위해 색인을 생성할 하위 항목을 지정합니다.

 

즉, Firebase는 권한이 없는 클라이언트가 Database에 처리하는 read/write을 허용하지 않도록 설정할 수 있다. 데이터의 무결성을 검사하는 것도 가능하다. 이러한 시스템은 클라이언트가 DB에 직접 접근하는 형태를 가능하게 하는 것이다.

 

클라이언트 코드를 조작한 해커가 DB를 망가트리는 요청을 보내더라도, 보안 규칙에 따라 처리되지 않도록 설정할 수 있고 조건에 맞지 않는 데이터를 넣는 것을 허용하지 않을 수 있다.

 

Firebase를 백엔드 대신 사용하는 경우에는 보안 규칙 설정이 매우 중요할 것이다. 그러나 일반적인 어플리케이션 개발에서는 클라-DB 구조는 사용되지 않는다고 보면 된다. 

 

참고

https://firebase.google.com/docs/auth?hl=ko

https://firebase.google.com/docs/database/security?hl=ko

댓글