GamjaWeb — 데이터베이스에서 Linux·Docker·보안으로

GamjaWeb — 데이터베이스에서 Linux·Docker·보안으로

Description
Linux·Docker·데이터베이스를 실제 웹 서비스로 연결하고 Naver Cloud에 배포하며 시스템 구조와 보안 경계를 경험한 풀스택 프로젝트
기간
Dec 1, 2023 → Feb 20, 2024
분야
개발
토이 프로젝트
상태
공개
시리즈
Systems & Web
요약
React·FastAPI·MySQL을 Docker Compose로 연결하고 Naver Cloud에 배포하며 시스템과 보안 경계를 배운 전체 기술 기록
원작성일
Feb 20, 2024
태그
Linux
Docker
Database
FastAPI
Web Security
🥔
전체 기술 기록 — 2023–2024년에 제가 웹의 전체 흐름을 배우기 위해 진행한 프로젝트입니다. 공개 GitHub는 2026년에 제가 비밀정보와 인가 문제를 정리해 다시 공개한 버전이며, 당시 구현 과정과 지금의 보안 회고를 나누어 적었습니다.
🧩
수업에서 배운 Linux·Docker·데이터베이스를 하나의 실제 서비스로 연결하고, Naver Cloud Platform에 배포하며 시스템 구조와 보안 경계를 경험한 초기 풀스택 프로젝트입니다.
항목
내용
개발 기간
2023.12.01 – 2024.02.20
수행 형태
3인 팀 프로젝트
나의 역할
MySQL 데이터베이스 설계, FastAPI 백엔드 API 구현, 클라이언트 연동, Docker Compose 실행 환경 구성
기술
Linux, Docker Compose, React, FastAPI, MySQL, Naver Cloud Platform
GitHub

프로젝트 배경 — 수업에서 배운 기술을 실제 시스템으로 연결하다

2023년 1학기 Linux를 학습하면서 운영체제를 단순히 명령어를 연습하는 환경이 아니라, 특정한 목적을 수행하는 시스템으로 사용해 보고 싶다는 생각을 갖게 됐습니다. 직접 필요한 패키지를 설치하고 실행 환경을 구성하는 과정에서 원하는 환경을 스스로 구축할 수 있다는 Linux의 매력을 느꼈고, 이는 운영체제와 시스템 구조에 관심을 갖게 된 계기가 됐습니다.
프로젝트 이전 수업에서 배운 Docker 역시 개념과 실습으로 끝내지 않고 실제 서비스에 적용해 보고 싶었습니다. React 클라이언트, FastAPI 서버, MySQL 데이터베이스를 서로 다른 서비스로 구성하고 Docker Compose로 연결하면서 컨테이너가 개발 환경에서 어떤 역할을 수행하는지 경험하고자 했습니다.
2023학년도 2학기 데이터베이스 과목을 수강한 뒤에는 관계형 데이터베이스가 실제 웹 서비스에서 어떻게 사용되는지 궁금해졌습니다. 특히 데이터베이스에는 사용자 계정과 게시글을 비롯한 서비스의 핵심 정보가 저장되므로, 기능 구현의 대상인 동시에 보안 관점에서 보호해야 할 주요 자산이라고 생각했습니다.
이에 수업에서 개별적으로 배운 Linux, Docker, 데이터베이스를 하나의 시스템으로 연결하기 위해 GamjaWeb을 시작했습니다.

무엇을 구현했나

GamjaWeb은 회원가입과 로그인부터 게시글·댓글·추천까지 기본적인 커뮤니티 흐름을 구현한 웹 서비스입니다.
  • JWT 액세스·리프레시 토큰을 이용한 회원가입, 로그인, 로그아웃
  • 카테고리별 게시글 작성·조회·수정·삭제
  • 일반 댓글과 게시글의 특정 문장을 선택해 의견을 남기는 드래그 댓글
  • 게시글 추천, 조회 수, 내가 작성한 글과 추천한 글 확인
  • 사용자 이름·GitHub 주소·비밀번호 변경
드래그 댓글은 게시글 전체에만 댓글을 남기는 대신, 사용자가 선택한 문장의 시작·종료 위치를 저장해 해당 문맥에 의견을 연결한 기능입니다.

시스템 구성

영역
사용 기술
경험한 내용
Client
React
화면 상태, 라우팅, API 요청과 응답 처리
Server
FastAPI
인증, 게시판 API, 비즈니스 로직과 권한 처리
Database
MySQL
사용자·게시글·댓글·추천 데이터와 관계 설계
Environment
Linux, Docker Compose
세 서비스를 분리하고 하나의 실행 환경으로 연결
Deployment
Naver Cloud Platform
공인 IP, 서비스 포트, 인바운드 접근 규칙을 설정해 외부 공개

데이터베이스를 ‘보호해야 할 자산’으로 바라보다

이 프로젝트에서 데이터베이스는 단순히 CRUD를 연습하기 위한 저장소가 아니었습니다. 사용자 계정과 서비스 활동 데이터가 모이는 핵심 자산이므로, 어떤 요청이 어떤 경로로 데이터에 도달하는지 직접 확인하는 것이 중요했습니다.
브라우저의 입력이 API 요청으로 변환되고, 서버의 인증·권한 판단을 거쳐 SQL 질의와 데이터 변경으로 이어지는 흐름을 구현하면서 클라이언트의 값을 그대로 신뢰하면 안 되는 이유를 구체적으로 이해할 수 있었습니다.
배포 과정에서는 공인 IP와 서비스 포트, 인바운드 접근 규칙을 다뤘습니다. 이를 통해 코드를 작성하는 것뿐 아니라 운영체제, 네트워크, 서버 설정도 서비스의 기능과 보안에 직접 영향을 준다는 점을 경험했습니다.

보안 관점에서 다시 본 초기 구현

처음에는 JWT를 발급하고 기능이 동작하게 만드는 데 집중했습니다. 이후 코드를 다시 검토하면서 다음과 같은 초기 설계의 한계를 확인했습니다.
  • 클라이언트가 전달한 사용자 식별자를 서버가 신뢰한 구조
  • 일부 수정·삭제 기능에서 부족했던 서버 측 소유권 검증
  • 소스코드에 포함된 JWT 비밀키와 고정된 배포 서버 주소
  • 비밀번호나 토큰 등 민감정보를 출력할 수 있었던 디버깅 로그
  • 학습 편의를 위해 토큰을 localStorage에 보관한 방식
이 회고를 통해 인증은 사용자가 누구인지 확인하는 과정이고, 인가는 그 사용자가 해당 작업을 수행할 권한이 있는지 검증하는 과정이라는 차이를 명확히 이해했습니다. 또한 비밀정보 관리와 네트워크 접근 제어가 애플리케이션 코드와 분리된 문제가 아니라는 점도 배웠습니다.

2026년 공개용 코드 정리

원래 개발 이력을 현재 프로젝트처럼 보이게 만들기보다, 당시 구조와 기능은 유지하면서 공개에 필요한 보안 문제를 정리했습니다.
  • JWT 비밀키와 배포 설정을 환경변수로 분리
  • 비밀번호·토큰 관련 민감 로그 제거
  • 요청 본문의 사용자 번호 대신 검증된 JWT의 사용자 식별자 사용
  • 게시글 수정·삭제 등 소유권이 필요한 작업에 서버 측 인가 적용
  • API 주소와 CORS 설정 환경변수화
  • Docker Compose 실행 및 핵심 사용자 흐름 검증
ℹ️
공개 저장소는 2023–2024년의 커밋 이력을 억지로 복원한 것이 아닙니다. 2026년에 제가 민감정보를 제거하고 실행 가능성을 다시 확인한 뒤 공개한 버전입니다.

이 프로젝트 이후

GamjaWeb 하나가 이후의 성과를 직접 만들어 냈다고 볼 수는 없습니다. 다만 Linux를 명령어 학습의 대상이 아니라 서비스가 실행되는 운영 환경이자 보안 경계로 바라보게 한 중요한 연결점이었습니다.
이 경험 이후 Linux 기반 개인 서버를 직접 구축하고, 리눅스마스터 1급을 취득했으며, 관심을 Linux와 Linux Kernel 취약점 분석으로 확장했습니다. 실제 취약점을 분석해 CVE 식별자를 할당받는 과정에서도 개별 코드만 보는 것이 아니라 운영체제, 네트워크, 애플리케이션과 데이터의 흐름을 함께 살펴보게 된 출발점으로 남았습니다.
Linux를 목적 있게 사용하고 → Docker로 실행 환경을 구성하고 → 데이터베이스를 핵심 보호 자산으로 바라보고 → 웹 서비스를 직접 구현·배포한 경험이 이후 Linux 보안 연구로 이어졌습니다.

한계와 배운 점

  • 초기 학습 프로젝트라 자동화 테스트, 운영 모니터링, 배포 자동화는 포함하지 못했습니다.
  • HTTP와 localStorage 기반 토큰 보관 등 실제 서비스에 그대로 적용하기 어려운 선택이 남아 있습니다.
  • 기능이 동작하는 것과 안전하게 운영할 수 있는 것은 다르며, 서버 측 권한 검증과 비밀정보 관리가 설계 단계부터 필요하다는 점을 배웠습니다.
  • 클라이언트·서버·데이터베이스·운영체제·네트워크를 하나의 흐름으로 이해한 첫 프로젝트라는 점에서 의미가 있습니다.