← 목록으로
👥 팀 프로젝트📅 2025.07 - 2025.11

MSG CTF Renewal

상명대(CodeCure) · 명지대(MJSEC) · 건국대(seKUrity) · 순천향대(SecurityFirst) · 중앙대(SECURIOUS)가 함께 운영한 오프라인 CTF 대회 플랫폼입니다. 문제 제출, 동적 점수 계산, 팀 점수/마일리지, 퍼스트 블러드, 관리자 운영 기능을 Spring Boot 기반 백엔드로 구현했습니다.

담당 역할

문제 제출/채점 흐름, 동시 제출 정합성, 동적 점수 계산, 팀 점수/마일리지, 퍼스트 블러드 처리, 관리자 검증 로직, 팀/유저 삭제 시 데이터 정합성 보정 기능을 담당했습니다. 특히 운영 중 발생할 수 있는 동시 플래그 제출, 504 timeout, 삭제 후 점수 재계산 문제를 중심으로 백엔드 구조를 개선했습니다.

MSG CTF Renewal screenshot 1

Tech Stack

Spring BootMySQLRedisJPARedissonSpring SecurityJWTSpring AsyncDockerNGINX

아키텍처 / ERD

핵심 제출 흐름은 User → Challenge → History/TeamHistory → Challenge Score → Team Score로 이어집니다. 정답 제출 시 개인/팀 중복 제출을 먼저 확인하고, Redisson Fair Lock으로 문제 단위 처리 순서를 보장했습니다. 락 획득 후에는 JPA 비관적 락으로 Challenge를 다시 조회해 solvers/points를 갱신하고, 커밋 이후 팀 점수 재계산과 퍼스트 블러드 알림 같은 후처리를 분리했습니다.

시스템 아키텍처

README에 정리했던 배포/운영 구조입니다. 포트폴리오에서는 CTF 플랫폼이 어떤 서버 구성으로 운영되는지 보여주는 보조 자료로 배치했습니다.

MSG CTF Renewal 시스템 아키텍처

ERD

유저, 팀, 문제, 제출 기록, 점수 데이터의 관계를 보여줍니다. 동시 제출 정합성, 팀 삭제, 유저 삭제 설명을 뒷받침하는 구조 자료로 활용했습니다.

MSG CTF Renewal ERD

주요 기능

  • 동시 플래그 제출 상황에서도 정답 기록, solvers, 동적 점수가 어긋나지 않도록 문제 단위 Redisson Fair Lock과 DB 비관적 락을 적용했습니다.
  • 문제를 푼 팀에게 점수와 마일리지를 반영하고, 퍼스트 블러드 팀에는 보너스 마일리지를 지급하는 흐름을 구현했습니다.
  • 관리자가 문제를 검수할 때는 정답/오답만 확인하고 히스토리와 랭킹에는 반영되지 않도록 제출 흐름을 분리했습니다.
  • 팀 삭제 시 제출 기록, solvers, 다이나믹 스코어, 퍼스트 블러드, 팀원 소속, 결제 히스토리를 함께 정리하도록 운영 기능을 구현했습니다.
  • 유저 삭제 시 토큰/리더보드/제출 데이터는 제거하고, 문제 해결 히스토리는 익명화해 대회 기록 통계를 보존하도록 처리했습니다.

트러블슈팅

  • 동시 제출 시 Redisson 락 타임아웃 문제문제 상황50개의 플래그 제출 요청이 동시에 들어오면 Redisson 분산 락의 waitTime 10초 안에 모든 요청이 락을 획득하지 못했습니다.기존 제출 흐름은 락 내부에서 히스토리 저장, 퍼스트 블러드 판정, 팀 점수 계산, 다이나믹 스코어링, 전체 팀 재계산까지 순차 처리했습니다.요청당 약 320~370ms가 소요되면서 10초 안에 약 25개 요청만 정상 처리되고, 나머지는 Try again later 또는 504 timeout으로 실패할 수 있었습니다.해결 방안락 없이 가능한 검증과 오답 처리는 먼저 수행하고, 락 내부에서는 중복 재검증, History/TeamHistory 저장, DB 비관적 락 기반 Challenge 재조회, solvers/points 갱신만 처리하도록 범위를 줄였습니다.PR 동시성 테스트 기준 성공률을 50%(25/50)에서 100%(50/50)로 개선했고, 평균 응답 시간은 약 5초에서 약 52ms 수준으로 줄였습니다.
  • 동적 점수 정합성 문제문제 상황동시에 여러 팀이 같은 문제를 풀면 solvers 증가 순서와 팀 점수 재계산 시점이 어긋나 팀마다 다른 점수가 반영될 수 있었습니다.비동기 처리만으로 후처리를 분리했을 때도 여러 스레드가 같은 Challenge를 읽고 수정하면서 Lost Update가 발생할 수 있었습니다.해결 방안락 획득 후 영속성 컨텍스트를 정리하고, Challenge를 비관적 락으로 다시 조회해 최신 solvers 기준으로 points를 계산했습니다.이후 영향받은 팀 점수를 재계산하도록 제출 흐름을 정리했습니다.
  • 팀 삭제 후 대회 데이터 정합성 문제문제 상황팀을 삭제하면 해당 팀이 푼 문제의 solvers, 다이나믹 스코어, 퍼스트 블러드, 팀원 소속 정보가 함께 바뀌어야 했습니다.제출 기록만 삭제하면 랭킹, 문제 점수, 퍼스트 블러드가 실제 데이터와 어긋날 수 있었습니다.해결 방안팀 히스토리와 개인 히스토리를 정리하고, 영향받은 문제들의 점수와 퍼스트 블러드를 다시 계산했습니다.이후 전체 팀 점수를 재계산해 삭제 이후에도 대회 통계가 일관되도록 처리했습니다.
  • 유저 삭제 트랜잭션 롤백 문제문제 상황유저 삭제 중 히스토리를 먼저 익명화한 뒤 loginId 기준으로 다시 삭제하려 하면서 삭제 대상 조회가 불가능해지고 트랜잭션이 롤백되는 문제가 있었습니다.모든 데이터를 단순 삭제하면 대회 문제 풀이 통계까지 함께 사라지는 문제도 있었습니다.해결 방안삭제 대상과 보존 대상의 의존성을 분리했습니다.토큰, 제출 기록, 리더보드처럼 유저에 강하게 묶인 데이터는 삭제하고, History는 삭제 대신 익명화하는 방식으로 대회 기록을 보존했습니다.

성능 / 안정성

  • 응답 시간 개선 기존 제출 흐름은 락 안에서 여러 후처리를 수행해 동시 요청이 몰릴 때 평균 응답 시간이 약 5초까지 늘어났습니다. 락 범위를 줄이고 후처리를 분리한 뒤, PR 동시성 테스트에서 평균 응답 시간 약 52ms, P95 약 85ms, P99 약 100ms 수준을 확인했습니다.
  • 비관적 락 기반 정합성 유지 분산 락은 애플리케이션 레벨의 제출 순서를 제어하지만, 락 밖에서 조회한 엔티티가 최신 상태라는 보장까지 제공하지는 않습니다. 락 획득 후 flush/clear로 영속성 컨텍스트를 정리하고, PESSIMISTIC_WRITE 기반 조회로 Challenge 행을 다시 잠근 뒤 solvers와 동적 점수를 갱신했습니다.
  • 커밋 이후 재계산 예약 점수 재계산이 제출 트랜잭션과 강하게 묶이면 응답 지연과 중복 재계산이 발생할 수 있었습니다. 트랜잭션 커밋 이후 필요한 재계산을 예약하는 방식으로 제출 응답과 후처리의 결합도를 낮췄습니다.
  • 동시성 테스트 기반 검증 Python 테스트 스크립트로 50명의 테스트 유저와 50개 팀을 생성하고, 같은 문제에 대한 동시 제출 상황을 재현했습니다. 개선 전에는 락 타임아웃으로 약 25개 요청만 정상 처리되던 흐름을, 개선 후 50개 요청 모두 실패 없이 처리되는지 검증했습니다.

보안 고려 사항

  • 관리자 제출 분리 관리자는 문제 검수를 위해 플래그를 제출할 수 있지만, 대회 히스토리와 점수에는 반영되면 안 됩니다. 관리자 요청은 정답/오답 검증만 수행하고 History, solvers, team score에는 영향을 주지 않도록 분리했습니다.
  • 오답 시도 추적 오답 제출은 단순 실패 응답으로 끝내지 않고 IP/유저/문제 기준으로 기록해 브루트포스 탐지와 차단 정책에 활용할 수 있도록 했습니다.
  • 인증/인가 기반 운영 API Spring Security와 JWT 기반 인증을 사용하고, 관리자 검증/팀 삭제/유저 삭제 같은 운영 API는 권한이 있는 사용자만 접근하도록 구성했습니다.

아쉬웠던 점

초기에는 정답 제출 후 필요한 처리를 한 흐름 안에서 모두 끝내는 방식이 이해하기 쉬웠지만, 실제 대회 운영에서는 동시 제출과 점수 재계산이 겹치면서 락 대기, 응답 지연, 정합성 문제가 드러났습니다. 이후 제출 경로를 검증, 기록, 점수 갱신, 재계산, 알림으로 나누면서 CTF 플랫폼은 단순 채점 기능보다 동시성 제어와 운영 데이터 정합성이 더 중요하다는 점을 배웠습니다.

프로젝트 유형

팀 프로젝트

기간

2025.07 - 2025.11

완료

2025-11

사용 기술

10 Technologies