ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 테스트 44개가 다 초록인데, 가렸어야 할 게 새고 있었어요
    AI Agent 2026. 6. 24. 21:00
    728x90
    반응형

    올리기 직전에, 그냥 눈으로 한 번만 보려고 진짜 데이터로 화면을 켰어요.

    그 칸을 보는데 손이 멈췄어요.
    분명 "이 사람한테는 내 실시간 정보 가리기"가 켜져 있는 계정이었거든요.
    특정 뷰어한테는 사용자의 실시간 상태가 안 보여야 하는 화면이었어요.
    그게 제가 작업한 거였고요.
    그런데 가렸어야 할 그 한 줄이, 그 칸에 그냥 떠 있더라고요.

    테스트는 44개가 전부 초록이었어요.
    화면은 아니라고 말하고 있는데.

    처음엔 제 눈을 의심했어요.
    새로고침도 해보고, 계정도 다시 확인했어요.
    가리기 켜진 거 맞고, 안 보여야 하는 정보 맞고.
    근데 보여요.
    44개가 다 초록인데 어떻게 이게 새지, 하면서 한참을 멍하니 봤어요.

    한 줄 막았더니, 더 큰 게 보였어요

    원인은 허무했어요.
    가리는 로직이 어떤 한 부류는 그냥 무조건 통과시키고 있었거든요.
    가리기 켰는지 껐는지 보지도 않고요.
    그 경로 하나가 필터를 통째로 비껴가 있었던 거예요.

    그 한 줄을 막고 다시 화면을 켰어요.
    사라졌더라고요.
    됐다 싶었죠.

    근데 등 뒤가 좀 서늘해서, 올리기 전에 응답을 통째로 한 번 펼쳐봤어요.
    화면 위쪽 한 줄 말고, 그 사람 데이터 묶음 전체를요.
    그제야 알았어요.
    제가 막은 건 아까 화면에서 눈으로 본 딱 그 한 줄이었고, 같은 묶음 안에 비슷하게 민감한 항목이 네다섯 개나 더 멀쩡히 실려 나가고 있었어요.
    누적 수치 같은 거요.
    화면 위쪽에 안 떠서 제가 못 봤을 뿐이지, 응답에는 다 있었어요.

    그러니까 제 첫 픽스는 "보이는 누수"만 막은 거였어요.
    안 보이는 나머지는 그대로 흘리면서.

    여기서 진짜 식은땀이 났어요.
    그럼 테스트 44개는 그동안 대체 뭘 보고 초록불을 켜준 거지.

    시험 범위를 내가 아는 한 문제로 좁혀놓고 만점 받은 거였어요

    테스트를 다시 열었는데, 답이 거기 있더라고요.

    테스트가 쓰는 가짜 데이터에는, 제가 처음에 누수를 본 바로 그 항목 하나만 값이 채워져 있었어요.
    나머지 민감 항목들은 아예 비어 있었고요.
    그러니 테스트는 "그 한 항목이 응답에서 빠졌나?"만 보고 초록을 줬던 거예요.
    빈 항목은 빠지든 말든 어차피 빈 값이니까, 검사에 걸릴 일이 없었고요.

    쉽게 말하면 시험 범위를 제가 아는 한 문제로 좁혀놓고 만점 받은 거랑 같아요.
    나머지 문제는 시험지에 실리지도 않았으니까요.

    44개가 다 초록이었던 건, 그 44개가 전부 제가 본 그 한 필드를 중심으로 짜여 있어서였어요.
    픽스처도 그 한 필드만 채웠고, 단언도 그 한 필드만 봤고.
    저는 "민감 정보가 안 샌다"를 검사하고 있다고 믿었는데, 실제로 검사하던 건 "내가 이미 발견한 그 누수가 재발 안 한다"였던 거예요.
    둘이 완전히 다른 말이더라고요.
    픽스처가 통과를 줬지, 가려야 한다는 약속이 지켜졌다는 걸 증명한 게 아니었어요.

    그래서 검사 기준을 통째로 바꿨어요

    진짜 픽스는 새는 줄 하나 더 막는 게 아니었어요.
    뭘 검사하느냐를 바꾸는 거였어요.

    가려야 할 항목을 다시 적었는데, 이번엔 화면에서 눈으로 본 필드 말고 모델 정의를 직접 펴서 거기 적힌 민감 카테고리 전부로요.
    그렇게 빼야 할 세트를 코드에 명시적으로 박아두니까, 거기서 빠진 게 곧 누수라는 게 눈에 드러났어요.
    그다음이 진짜였는데, 테스트 픽스처가 그 카테고리의 모든 필드를 다 채우도록 고쳤어요.
    한 칸이라도 응답에 새어 나가면 픽스처에 값이 있으니까 단언이 깨지게요.
    빈 값으로 통과를 도둑맞는 일이 더는 안 일어나도록.

    이게 쇼핑몰 영수증 가리기랑 비슷하더라고요.
    카드번호 한 칸만 별표로 가려놓고 "민감정보 가림 완료" 한 거예요.
    정작 같은 영수증에 주소랑 전화번호는 그대로 찍혀 나가는데.
    가린 칸 하나만 보고 다 가렸다고 믿은 거죠.

    지금 남은 것

    이제 "안 보여야 하는" 기능을 짤 때는 픽스처부터 의심해요.
    빼는 단언을 짜기 전에 "이 픽스처가 카테고리 전체를 채우고 있나?"부터 보고요.
    한 칸만 채워진 픽스처는 그 위에 검사를 백 개 쌓아도 결국 한 칸짜리 검사거든요.
    개수는 안심을 주는데, 정작 보고 있는 면적은 안 넓혀주더라고요.

    근데 솔직히 그날 저를 살린 건 검사가 아니라, 그냥 진짜 데이터로 화면을 한 번 켜본 거였어요.
    그게 좀 마음에 안 들어요.
    운이었잖아요.
    44개 초록불을 다 믿었으면 그대로 올렸을 거고, 누군가의 가려놓은 정보가 남한테 보였을 거예요.

    아직 못 푼 게 하나 있어요.
    카테고리에 새 필드가 추가되면, 픽스처랑 빼는 세트가 자동으로 같이 늘어나게는 못 만들었거든요.
    지금은 사람이 모델 정의 보고 손으로 맞춰 적는 구조라, 누가 필드 하나 추가하면서 픽스처를 안 건드리면 그 필드는 또 조용히 검사 밖으로 빠질 거예요.
    그날 저를 살린 그 한 줄이 결국 운이었던 것처럼요.
    다음엔 그 목록을 한 곳에 묶어두고 거기서 같이 끌려오게 만들 생각인데, 오늘은 일단 가리는 화면 손댈 때마다 진짜 데이터로 한 번 켜보는 걸로 버티는 중이에요.

    728x90
    반응형
Designed by Tistory.