해킹스터디

[Normaltic 웹해킹 입문] 3강 관련 복습&리뷰-①(DB)

herini0829 2025. 11. 4. 20:51

🐋 MySQL/MariaDB로 실전 DB 만들기 — 기초부터 계정/권한까지

잠깐 방심하면 진도가 밀린다… 꾸준히! 도커 인강도 들어야 하는데… 😉
각설하고, 실제 DB를 만들어보자. (MySQL 또는 MariaDB 기준)

✅ 준비 사항
• MySQL 또는 MariaDB 설치 완료
• 터미널에서 mysql -u root -p 접속 가능
• 본문 예제는 직접 복붙 가능한 표준 SQL로 정리했습니다 (스마트따옴표 ❌).

1) 데이터베이스 생성

UTF-8(이모지 포함) 안전하게 쓰려면 utf8mb4 + _general_ci(대소문자 구분 없이 비교) 조합을 권장합니다.

-- DB 접속
mysql -u root -p

-- DB 생성 (이미 있다면 IF NOT EXISTS 사용)
CREATE DATABASE IF NOT EXISTS FSI
  DEFAULT CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;

-- 생성 확인
SHOW DATABASES;

-- 작업 대상 지정
USE FSI;

2) 테이블 생성

사용자 계정 정보를 담을 users 테이블. 나중에 해시 비밀번호를 저장할 것이므로 VARCHAR(255)로 충분합니다.

CREATE TABLE IF NOT EXISTS users (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
해설
id : 각 사용자를 구분할 고유번호, 자동 증가
username : 50자 제한, 필수, 중복 불가(UNIQUE)
password : 해시 보관을 가정해 255자 할당 (평문 저장 금지!)

3) 테스트 데이터 입력 & 조회

학습용으로만 평문을 넣어보고, 실제 서비스에서는 반드시 해시하세요.

-- (학습용) 평문 비밀번호 예시
INSERT INTO users (username, password)
VALUES ('admin', '1234');

-- (권장) 앱에서 해시 생성 후 저장 (예: PHP의 password_hash)
-- INSERT INTO users (username, password) VALUES ('admin', '<해시된 문자열>');

-- 확인
SELECT * FROM users;

4) 전용 DB 계정 만들기 (root 금지)

root는 모든 DB를 건드릴 수 있으므로 애플리케이션 전용 계정을 만들어 사용합니다.

-- 계정 생성 (해당 서버 로컬 접속만 허용)
CREATE USER 'shbs08290'@'localhost' IDENTIFIED BY '1234';

-- 권한 부여: FSI DB에 한정
GRANT ALL PRIVILEGES ON FSI.* TO 'shbs08290'@'localhost';

-- (참고) 최신 MySQL/MariaDB는 GRANT 즉시 반영. 아래는 호환 목적
FLUSH PRIVILEGES;

-- 권한 확인
SHOW GRANTS FOR 'shbs08290'@'localhost';
보안 팁
• 실제 운영에선 ALL PRIVILEGES 대신 필요한 것만 부여하세요 (예: SELECT, INSERT, UPDATE, DELETE).
• 원격 접속이 필요하면 호스트를 '%' 대신 특정 IP로 제한: 'appuser'@'203.0.113.10'
• 비밀번호는 앱(PHP 등)에서 password_hash()로 해시 후 저장하세요. (기본값 권장)

5) 자주 겪는 오류 & 빠른 점검

  • 따옴표 문제: ‘ ’ 같은 스마트따옴표 말고 ' 단일따옴표를 쓰세요.
  • 권한 오류: Access denied → 사용자/호스트/권한 매칭 확인(SHOW GRANTS ...).
  • 문자셋 깨짐: DB/테이블/세션 모두 utf8mb4로 통일. P