pg 라이브러리를 사용해서 express에서 PostgreSQL을 사용하기 위해 공식 문서를 읽어보던 중, 매개변수화된 쿼리(Parameterized query) 항목을 보고 흥미가 생겼습니다. 우선 일반적인 쿼리문과는 다른 형태를 하고 있었고, SQL Injection 공격을 방지한다고 되어 있어서 일반적인 쿼리문보다 좋아 보였습니다. 하지만 공식 문서만 보고는 SQL Injection 공격이 무엇인지, 그리고 매개변수화된 쿼리가 어떻게 SQL Injection 공격에 더 안전한지 알 수가 없어서 관련 정보들을 찾아봤습니다.


1. SQL Injection 이란?

  SQL Injection은 가장 흔한 웹 해킹 기법 중 하나로써 웹 페이지 입력을 통해 SQL 문에 악성 코드를 삽입해서 데이터 베이스를 파괴할 수 있는 기법입니다. SQL Injection은 "1=1"이 항상 true 값을 반환한다는 것을 기반으로 합니다.

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

 

  "1=1"이 항상 true이기 때문에, UserId = 105와 상관없이 항상 true가 되어서 테이블의 모든 행을 반환합니다.

 

  직접 SQL 쿼리를 입력해 보면 이해하기 쉬울 것입니다. 만약 테이블에 user 이름과 비밀번호가 포함되어 있다면 해커는 105 OR 1=1을 삽입하여 데이터베이스의 모든 사용자 이름과 비밀번호에 액세스 할 수 있습니다.


2. 매개변수화된 쿼리(Parameterized query)

  매개변수화된 쿼리는 SQL Injection을 방지하는 효과적인 방법 중 하나입니다. 그 이유는 쿼리 구조와 데이터를 분리하기 때문입니다. 매개변수화된 쿼리의 구조는 다음과 같습니다.

const { pool } = require('../db');

const { UserId1, UserId2 } = req.query;

// 매개변수화된 쿼리 (Parameterized query)
const query = '
SELECT * FROM Users 
WHERE UserId = $1 OR UserId = $2
';
const values = [UserId1, UserId2];

const res = await pool.query(query, values);
console.log(res.rows);

 

  위 코드와 같이 UserId 값은 쿼리에서 직접 입력되는 것이 아니라, 별도의 값으로 전달이 됩니다. 따라서, 데이터는 쿼리의 일부로 해석되지 않습니다. 따라서, 일반적인 쿼리문을 쓰는 것보다 매개변수화된 쿼리를 사용하면 데이터베이스의 안전성을 높이고, SQL Injection 공격을 효과적으로 방어할 수 있습니다.


참고문헌

1. Parameterized Query - node-postgres 공식 문서 (링크)

2. SQL Injection - W3 Schools (링크)

  PostgreSQL을 설치할 때 비밀번호를 설정해주는데, 이 비밀번호를 변경하는 방법을 알아보겠습니다.


1. 서비스에서 postgresql-x64-16 시작하기

 

  검색창을 열어서 서비스를 입력하거나 윈도우 키+R을 눌러서 "services.msc"를 입력해서 서비스 메뉴에 들어갑니다.

 

  postgresql-x64-16 서비스가 시작이 되어있지 않다면 마우스 우클릭을 해서 시작을 눌러줍니다.


2. 환경 변수 등록하기

  PowerShell이나 터미널에서 아래와 같이 입력을 해줍니다.

psql -U postgres

 

  만약 psql 명령어를 찾지 못한다는 문구가 뜬다면 환경변수를 등록해줘야 합니다. 환경 변수 등록을 위해서 PostgreSQL이 설치된 폴더를 찾아야 합니다. (psql 명령어가 잘 작동한다면 이 단계는 패스하시고 다음 단계를 진행하시면 됩니다.)

C:\Program Files\PostgreSQL\<Version>\bin

# Example
# C:\Program Files\PostgreSQL\16\bin

 

  저의 경우에는 16 version이라, 디렉토리 경로는 "C:\Program Files\PostgreSQL\16\bin"이었습니다.

 

  경로를 찾았으면 윈도우 검색 창에서 시스템 환경 변수 편집을 검색하거나, 윈도우키 + R을 눌러서 "sysdm.cpl ,3"을 입력해서 시스템 환경 변수 편집 메뉴로 진입해 줍니다. 시스템 속성 메뉴가 뜨면 환경 변수(N)라고 되어 있는 메뉴를 클릭합니다.

 

  환경 변수 창이 뜨면 시스템 변수(S)라고 써져 있는 곳에서 Path 부분을 찾아서 더블 클릭을 합니다.

 

  새로 만들기(N)를 눌러서 아까 찾은 PostgreSQL 디렉토리 경로를 입력해 주고 확인을 눌러주세요. 그리고 재부팅을 해야 추가된 환경 변수가 적용이 됩니다.


3. PowerShell이나 터미널에서 비밀번호 변경

  환경 변수 등록을 마치고 재부팅을 했다면, 이제 PowerShell이나 터미널에서 psql 명령어가 잘 작동할 것입니다.

psql -U postgres

 

  터미널에 접속해서 위와 같이 입력하고 프로그램을 설치할 때 입력했던 비밀번호를 입력하면, PostgreSQL에 접속하실 수 있습니다.

ALTER USER postgres WITH PASSWORD "변경할 비밀번호";

# Example
# ALTER USER postgres WITH PASSWORD "1234";

 

  접속하신 후에, 위와 같이 명령어를 입력해 주면 비밀번호 변경이 완료가 됩니다.

 

  ALTER ROLE 문구가 뜨면 비밀번호 변경이 완료된 것입니다.

'코딩 공부 > SQL' 카테고리의 다른 글

[PostgreSQL] 매개변수화된 쿼리 (Parameterized query)  (0) 2024.07.20

+ Recent posts