운영 중인 병원 서비스 보안·장애 대응
운영 중인 병원 서비스의 보안 점검 결과를 조치하고, 반복 장애의 원인을 찾아 재발 경로를 설정과 코드로 닫은 작업
- 운영 중인 병원 서비스의 보안 점검에서 나온 인증·권한 검사 누락과 설정 노출을 고치고, 후속 절차를 문서로 넘겼습니다.
- 안과 사이트가 멈춘 원인(DB 커넥션 풀 소진)을 고치고, 우회 수정이 새 문제를 만들자 되돌린 뒤 근본 원인을 찾았습니다.
- 인증서 갱신 중단, 로그로 인한 디스크 고갈처럼 조용히 쌓이던 운영 문제를 설정 단위로 막았습니다.
문제
두 병원 서비스를 운영하면서 문제가 드러났다.
피부과 서비스. 보안 점검에서 일부 API의 인증·권한 검사 누락, 저장소의 시크릿 관리, 내부 서비스 노출 문제가 나왔다.
안과 사이트. 트래픽이 몰릴 때 운영이 멈췄다. 메인 페이지 첫 응답이 느렸고, 목록 응답이 불필요하게 컸다.
운영 전반. 인증서 자동 갱신이 멈춰 있었고, 컨테이너 로그가 무제한으로 쌓여 디스크가 찼다. 연달아 머지하면 늦게 끝난 빌드가 최신 이미지를 덮어썼다.
해결
인증·권한. 누락된 인증 검사를 채우고, 관리자 API는 역할까지 검사하는 서버 가드로 바꿨다. 로그인 시도 제한과 업로드 검증을 넣고, 관리자가 작성한 HTML은 렌더 전에 정화했다. 인사 민감정보는 암호화하고 열람 기록을 남기게 했다.
설정과 시크릿. 저장소에 남아 있던 설정 파일을 정리하고, 키 재발급과 히스토리 정제 절차를 문서로 넘겼다. 외부에 열려 있던 내부 서비스는 서버 안에서만 접근하도록 묶고, 배포에서 빠지던 보안 헤더가 실제로 적용되게 했다.
커넥션 풀 고갈. 운영이 멈춘 원인은 DB 커넥션 풀 소진이었다. 요청마다 여러 번 나가던 방문 기록 쿼리를 한 번의 UPSERT로 줄이고, 풀 설정을 조정했다. 이후 통계 화면이 멈추는 문제를 요청마다 새 DB 클라이언트를 만드는 방식으로 우회했다가, 연결 누수로 한도를 넘겨 되돌렸다. 다시 추적해 보니 운영에서 클라이언트가 서버 번들마다 따로 생기고 있었다. 단일 인스턴스로 고쳤다.
응답 속도. 서버 렌더링을 막던 외부 영상 목록 조회를 렌더 경로에서 뺐다. 목록 응답에서는 본문 필드를 제외했다.
운영 설정. 인증서 갱신 컨테이너에 재시작 정책을 넣고, 모든 컨테이너 로그에 크기 상한을 뒀다. CI는 main 브랜치 단위로 직렬화했다.
| 정한 것 | 대신 버린 것 | 이유 |
|---|---|---|
| DB 연결 관리운영에서도 DB 클라이언트 단일 인스턴스 | 요청마다 새 DB 클라이언트 생성 (통계 화면 멈춤 우회 시도) | 우회 시도는 연결 누수로 DB 연결 한도를 넘겨 되돌렸다. 운영에서 클라이언트 캐시가 꺼져 있어 서버 번들마다 클라이언트가 새로 생기고 있었다. |
| 인증서 자동 갱신인증서 갱신 컨테이너에 재시작 정책 추가 | 기존 설정 유지 | 갱신 컨테이너가 비정상 종료된 뒤 다시 뜨지 않아 자동 갱신이 멈춰 있었다. |
| CI 동시 실행main 브랜치 CI를 직렬화 | 병렬 실행 허용 | 연달아 머지하면 늦게 끝난 빌드가 최신 이미지를 덮어썼다. |
그 밖의 운영 대응 (GitHub 이전 작업)
- 다국어 병원 사이트 SEO/AEO/GEO 개선 — 라이트하우스 기준 SEO 점수 35 → 88
- 네이버 광고 검수 반복 실패 — 서버에서 네이버 크롤러 IP를 막고 있던 원인을 찾아 해소
- AWS 아웃바운드 트래픽 급증 — 로그로 원인을 분석하고 비용 조정을 요청
결과
- 점검에서 나온 인증·권한 누락을 서버 쪽에서 막아, 권한 없는 접근 경로를 닫았다.
- 인증서 갱신 중단, 디스크 고갈, 이미지 덮어쓰기는 각각 설정 변경으로 재발 경로를 막았다.
- 안과 사이트의 속도 개선은 수정 후 측정값이 남아 있지 않다.
계약상 병원 실명, 도메인, 보안 점검의 세부 항목은 공개하지 않는다.
이 프로젝트가 궁금하시면 편하게 물어보세요.
연락하기