
이 글은 인프런 강의 「백엔드 개발자를 위한 서버 보안 실무」 섹션 6 앞부분을 입문자용으로 풀어 쓴 글이에요.
배송지 조회 기록을 계정별로 세어 봤더니, 보통 사용자는 하루에 몇 번 자기 주소를 봅니다. 그런데 한 계정이 하루에 만 번 넘게 조회했어요. 몇 달 동안 아무도 몰랐습니다.
왜 몰랐을까요? 요청 하나하나는 완벽하게 정상이었거든요. 진짜 토큰으로, 수많은 IP에서 조금씩 나눠서 보냈으니까요. 에러도 없고, 알림도 울리지 않았습니다.
지금까지는 문을 닫는 이야기를 했다면, 이번 글은 문이 열렸을 때 알아채는 것과 우리가 가져다 쓰는 것들을 믿을 수 있는가에 관한 이야기예요.

석 달 전 배포할 때 스캔했던 컨테이너 이미지를 오늘 다시 스캔하면, 치명·높음 등급 취약점이 여러 건 나오기도 해요. 이미지는 한 글자도 바뀌지 않았는데 말이죠. 바뀐 건 취약점 데이터베이스입니다. 새 CVE는 매일 공개되니까요.
그래서 원칙은 운영 중인 이미지를 정해진 주기로 다시 스캔하는 거예요. 코드가 바뀌지 않으면 CI도 다시 돌지 않으니, 스캔은 코드 변경과 상관없이 돌아가야 합니다. 그리고 모든 결과를 당장 고칠 수는 없으니, 실제로 악용 중인 취약점부터 처리해요(마지막 글에서 자세히 다룹니다).
그리고 탐지의 함정이 하나 있어요. 알림이 너무 많으면 결국 아무도 안 봅니다. 처음부터 막지 말고 먼저 지켜보고, 확실한 신호부터 자동 대응을 붙이는 게 순서예요.

금요일 오후에 올라온 PR이 기능 테스트도 통과하고 리뷰 승인도 받았어요. 그런데 검색어를 쿼리에 이어 붙인 코드와, 알려진 취약점이 있는 라이브러리 버전이 숨어 있습니다. 사람은 놓칠 수 있어요. 그래서 도구를 붙입니다.
핵심은 오탐 관리예요. 결과가 시끄러우면 개발자는 결과를 보지 않게 됩니다. "새로 생긴 것만, 정확하게" 알리는 게 오래 쓰는 비결이에요.

우리 서비스 코드의 대부분은 사실 남이 쓴 코드예요. 오픈소스 패키지, CI에서 쓰는 액션, 베이스 이미지까지요. 최근 몇 년 사이 실제로 이런 일들이 있었습니다.
같은 태그, 같은 패키지 이름인데 내용이 바뀐 거예요. 원리 수준의 방어는 이렇습니다. 태그 대신 변하지 않는 커밋 해시로 고정하고, 새 버전은 며칠 지켜본 뒤 받아들이고(보안 업데이트는 예외), CI 권한은 최소로, 배포 전에는 서명과 출처를 확인해요. 보안 도구 자체도 공급망의 일부라는 점을 잊지 마세요.

컨테이너 안의 앱이 root로 돌고, 특권 모드에, 디버깅하려고 연결한 호스트의 도커 소켓까지 붙어 있다면? 앱 취약점 하나로 얻은 셸이 호스트 전체와 같은 서버의 다른 컨테이너로 번질 수 있어요.
목표는 "안 뚫리는 컨테이너"가 아니라 "뚫려도 밖으로 못 나가는 컨테이너" 예요. 일반 사용자로, 읽기 전용으로, 필요 없는 권한은 빼고, 실행에 필요한 것만 남긴 작은 이미지로 만듭니다. 셸이 없으면 들어와도 쓸 도구가 없어요.
강의에서는 이걸 직접 붙여 봅니다
섹션 6 전반부에서는 이미지와 의존성 스캔, 계정별 이상 조회 탐지와 자동 차단, CI 보안 테스트, 공급망 고정과 서명 검증, 컨테이너 탈출 재현과 차단을 직접 구성합니다.
- 매일 운영 이미지를 다시 스캔하는 파이프라인과 예외 관리 방법
- SAST·SCA·DAST를 PR과 스테이징에 나눠 붙이고 오탐을 다루는 규칙
- 최소 권한 CI, SBOM, 키 없는 서명까지 이어지는 공급망 방어
강의 보러 가기: https://inf.run/XvwyH