티빙 3,954만 계정: 코드 속 접속키와 고치다 만 모의해킹

아프로·2026년 11월 1일

티빙 3,954만 계정 표지

이틀. 공격자가 티빙에 들어와 3,954만 계정을 빼내기까지 걸린 시간입니다. 출발점은 개발자의 개발환경 접속키 하나였습니다. 그 키는 소스코드에 노출돼 있거나 평문으로 저장돼 있었습니다. 그리고 이 약점은 2024년 모의해킹에서 이미 지적받은 것이었습니다.

사고 원인: 코드 속 시크릿 + 지적사항 방치. 쿠팡(03편)과 같은 "코드 속 시크릿" 패턴이 반년 만에 다시 나왔습니다. 시크릿은 비밀번호·API 키·서명키·인증키처럼 코드와 로그 밖에 숨겨야 하는 값입니다.

한눈에 보기

항목내용
침투·유출2026-05-29 침투, 05-31 약 24GB 유출(이틀)
규모3,954만 697개 계정. 중복 제거 시 약 1,953만 명(회사 추정)
항목20개 항목 70종(ID·이름·생년월일·연락처·CI·환불계좌·단방향 암호화 비밀번호 등)
소스코드개발 프로젝트 361건(30.35GB)
제재개인정보위 과징금 미결정(9월 중순 기준), 과기정통부 신고 지연 과태료 예정(상한 3,000만 원)
현재 상태집단소송 누적 15만 명 이상. 2026년 10월 말 기준 진행 중

계정 내역은 활성 2,206만, 휴면 850만, 탈퇴 887만, 테스트 11만 개입니다. 탈퇴한 사람의 계정까지 들어 있었습니다. CI는 본인확인기관이 사람마다 하나씩 부여하는 연계정보입니다.

무슨 일이 있었나

  • 2026-05-29 개발환경 접속키를 탈취한 공격자가 침투했습니다.
  • 2026-05-30 첫 유출 시도는 데이터베이스(DB)에 과부하가 걸리면서 차단됐습니다.
  • 2026-05-31 공격자가 가상서버를 새로 만들어 약 24GB를 빼냈습니다. 조사단은 회사가 이날 오전 10시 10분에 사고를 인지했다고 판단했습니다.
  • 2026-06-01 오후 3시 8분 한국인터넷진흥원(KISA)에 신고했습니다. 24시간 기한을 넘겼습니다.
  • 2026-06-03 이용자 공지가 나갔고, 09-03 민관합동조사단이 조사 결과를 발표했습니다.

개발자 접속키에서 개발환경, 운영 DB, 새 가상서버를 거쳐 외부로 이어지는 경로와 막을 수 있었던 네 지점

경로는 원리 수준까지만 봅니다. 공격자는 접속키 하나로 개발환경을 거쳐 운영 DB까지 닿았습니다. 첫 시도가 과부하로 멈추자 다음 날 가상서버를 새로 만들었고, 데이터는 그 서버를 거쳐 밖으로 나갔습니다. 키를 어떻게 탈취했는지는 발표되지 않았습니다.

왜 뚫렸나

민관합동조사단이 밝힌 원인입니다.

  1. 코드 속 접속키. 개발·운영 접속키가 소스코드에 노출돼 있거나 평문으로 저장돼 있었습니다. 키를 사내 메신저로 공유하기도 했습니다.
  2. 지적받은 곳만 수정. 2024년 모의해킹에서 이 문제가 지적됐지만, 회사는 해당 프로젝트만 고치고 전사로 넓히지 않았습니다.
  3. 키 하나로 전부. 모든 개발자가 모든 프로젝트에 접근할 수 있었습니다. 전화번호와 이메일은 암호화했지만 암호화키가 함께 유출돼 평문과 같은 수준이었습니다.
  4. CPU만 본 모니터링. 모니터링이 CPU 부하 수준에 그쳐 데이터 흐름을 실시간으로 보지 못했습니다. 첫 이상징후에서 정보보호 최고책임자(CISO) 공유까지 약 14시간 걸렸습니다.

여기에 보안 전담인력이 임직원 265명 중 4명이었습니다. 서비스가 크는 속도를 보안 인력이 따라가지 못한 셈입니다.

03편 쿠팡과 비교하면 모양이 닮았습니다. 쿠팡은 코드에 박힌 서명키를, 티빙은 코드에 노출된 접속키를 바꾸거나 치우지 않았습니다. 두 회사 모두 이전 모의해킹에서 지적을 받았고, 그 지적이 사고 경로로 남았습니다.

개발자 시점: 내 서비스였다면

같은 실수를 일반 웹 서비스 코드로 옮겨 봅니다. 사고 회사의 코드가 아니라 같은 실수를 보여 주는 일반 예시입니다. 값은 모두 가짜입니다.

# 위험한 모양 · 일반 예시
# config.py  (git에 커밋됨)
CLOUD_KEY_ID = "FAKE-AKID-0000"
CLOUD_SECRET = "FAKE-cloud-secret-0000"
DATA_KEY = "FAKE-data-key-0000"

def save_phone(db, user, phone):
    enc = encrypt(phone, DATA_KEY)
    db.insert(user, enc)

# 파일을 지워도 git 이력에 남는다

설정 파일에 클라우드 접속키가 그대로 적혀 있고, 이 파일이 저장소에 커밋됐습니다. 나중에 파일에서 키를 지워도 git 이력에는 그대로 남아서, 저장소를 받은 사람은 누구나 볼 수 있습니다. 아래 함수는 전화번호를 암호화하지만 암호화키가 같은 파일에 있습니다. 저장소를 가져간 쪽은 키도 함께 가져갑니다.

# 고친 모양 · 일반 예시
# 코드에 키 없음 · SSO로 단기 토큰
creds = sso.session(
    role="dev-readonly", ttl_min=60)

def save_phone(db, kms, user, phone):
    dek = kms.data_key("pii-key")
    enc = encrypt(phone, dek.plain)
    db.insert(user, enc, dek.wrapped)
    # 마스터 키는 KMS 밖으로 안 나감

# 커밋 전·CI: git 이력 전체 시크릿 스캔
# (gitleaks 등) → 찾은 키는 교체

고친 모양은 세 군데가 다릅니다.

  • 고정 키 대신 단기 자격증명. 코드에는 키가 없습니다. 개발자는 사내 통합 로그인(SSO)으로 한 시간짜리 토큰을 받고, 권한도 읽기 전용으로 좁혔습니다.
  • 봉투 암호화. 키 관리 서비스(KMS)가 데이터 키를 감싸 주고, 감싼 키만 데이터 옆에 저장합니다. 마스터 키는 KMS 밖으로 나가지 않으므로, KMS 권한이 없으면 DB를 통째로 가져가도 읽지 못합니다.
  • 이력까지 시크릿 스캔. 커밋 전과 CI(코드를 올릴 때마다 자동으로 도는 검사)에서 git 이력 전체를 검사합니다. 찾은 키는 지우는 데서 끝내지 않고 반드시 교체합니다. 이미 누군가 받아 간 저장소에는 그 키가 남아 있기 때문입니다.

막을 수 있었던 네 지점

위 흐름도의 그린 표시와 같은 번호입니다.

  1. 지적을 전체 저장소에. 2024년 모의해킹 지적을 전체 저장소에 적용했다면 침투 경로가 없었습니다.
  2. 최소권한. 권한을 나눴다면 키 하나로 프로젝트 361건과 운영 DB에 모두 닿지 못했습니다.
  3. 암호화키 분리. 암호화키를 데이터와 분리해 보관했다면 유출돼도 읽을 수 없었습니다.
  4. 대량 조회·외부 전송 차단. 대량 조회와 외부 전송을 실시간으로 막았다면 5월 30일 첫 시도에서 끝났을 것입니다. 새 가상서버가 생기는 일도 알림을 걸 대상입니다.

1번은 들어오는 길을, 2번은 들어온 뒤 닿는 범위를, 3번은 가져간 데이터의 쓸모를, 4번은 빠져나가는 시간을 줄입니다.

같은 사고를 막는 점검 5줄

  1. 현재 코드뿐 아니라 git 이력까지 시크릿을 스캔하고, 찾은 키는 무조건 교체한다.
  2. 개발환경 접속은 고정 키 대신 SSO·단기 토큰으로 하고, 권한은 프로젝트별로 나눈다.
  3. 키는 메신저 대신 비밀 관리 도구로 공유한다.
  4. 암호화키는 데이터와 떨어진 곳(KMS)에 둔다.
  5. 대량 조회, 신규 가상서버 생성, 대용량 외부 전송에 알림을 건다.

한 가지를 더하면, 모의해킹에서 한 곳의 취약점이 나오면 전사에서 같은 패턴을 찾아 함께 조치합니다.

제재와 비용

2026년 10월 말 기준 제재는 아직 진행 중입니다.

  • 개인정보위: 과징금은 9월 중순 기준으로 결정되지 않았습니다.
  • 과기정통부: 신고 지연에 과태료를 물릴 예정이며, 상한은 3,000만 원입니다.
  • 소송·국정감사: 집단소송 참여자는 누적 15만 명을 넘었습니다. 대표는 10월 6일 과방위, 10월 7일 문체위 국정감사에 증인으로 출석했습니다.
  • 보상: 티빙포인트 약 5천 원, 웨이브 1개월 또는 CGV 할인권, 해킹·피싱 보험이 나왔습니다.

과징금이 결정되면 이 절을 고칩니다. 위 내용은 공개 보도·발표를 정리한 것이며 법률 자문이 아닙니다.

정리

  • 소스코드와 평문에 남은 접속키 하나로 개발환경과 운영 DB가 열렸고, 이틀 만에 3,954만 계정과 프로젝트 361건이 유출됐습니다.
  • 2024년 모의해킹 지적은 해당 프로젝트에만 반영됐고, 넓은 권한과 데이터 옆의 암호화키가 피해를 키웠습니다.
  • 지적받은 곳만 고치는 것은 고친 것이 아닙니다. 모의해킹 결과는 전사의 같은 패턴을 찾으라는 신호입니다.

더 깊게

인프런 「백엔드 개발자를 위한 서버 보안 실무」 수업

  • 5-3 시크릿 관리: .env 유출, 저장소 스캔, 키 회전
  • 6-7 클라우드 계정이 진짜 자산이다: IAM 최소 권한과 감사 로그
  • 5-5 정보유출을 막는 네 가지: 이그레스 통제와 DLP
  • 5-2 저장 데이터 암호화와 KMS 키 관리

짝이 되는 편: 쿠팡 3,367만 건 유출: 서명키 하나와 바꾸지 않은 키. 같은 "코드 속 시크릿" 패턴을 서명키 쪽에서 봅니다.

보안을 더 알고 싶다면

오늘 본 사고의 원인은 대부분 서버와 코드의 기본기에서 막을 수 있는 것들이었습니다. 직접 손으로 막아 보고 싶다면 이런 강의도 있습니다.

백엔드 개발자를 위한 서버 보안 실무: 해킹 방어부터 정보유출 방지까지

  • 서버를 공격하는 흐름을 로그로 보고, 내 서버와 Spring·Express 코드에서 직접 막아 봅니다.
  • SSH 하드닝, 인젝션, 인증·인가, 시크릿과 개인정보 보호, 침해사고 첫 한 시간까지 8개 섹션 54개 수업입니다.
  • 이 글과 이어지는 수업: 5-3 시크릿 관리: .env 유출, 저장소 스캔, 키 회전 · 6-7 클라우드 계정이 진짜 자산이다: IAM 최소 권한과 감사 로그 · 5-5 정보유출을 막는 네 가지: 이그레스 통제와 DLP

출처와 확인 날짜

수치는 2026년 10월 말 기준 공개 보도·발표입니다. 진행 중인 사건은 바뀔 수 있고, 이 글은 법률 자문이 아닙니다.


이전 글 쿠팡 3,367만 건 유출: 서명키 하나와 바꾸지 않은 키
다음 글 롯데카드 297만 명: 8년 된 취약점과 잊혀진 결제 서버
시리즈 전체 목록 해킹 사고 해부 전체 목록

profile
고인물 개발자(OG)

0개의 댓글