공식 데이터를 직접 뜯어보고, follow timestamp 불변성으로 어디까지 추정할 수 있는지 충돌 확률까지 계산한 1인칭 연구 기록.
CheckMate를 운영하면서 가장 자주 받은 항의성 문의는 이런 것이었습니다. "분명히 맞팔이던 사람이 갑자기 언팔로 떴는데, 알고 보니 그냥 아이디를 바꾼 거였어요. 도구가 틀린 거 아닌가요?" 처음엔 단순 버그라고 생각했습니다. 그런데 같은 패턴의 문의가 쌓이면서, 이게 우리 도구만의 문제가 아니라 Instagram이 공식적으로 내보내주는 데이터의 구조적 한계라는 걸 깨달았습니다. 이 글은 "그럼 닉변을 추적하는 게 정말 불가능한가"라는 질문을 붙잡고, 공식 문서와 실제 내보내기 파일을 직접 뜯어보며 답을 찾아간 기록입니다.
두 시점의 팔로워 목록을 비교한다고 해봅시다. 4월에 받은 목록에는 summer_diary_22가 있었는데, 6월 목록에는 그 계정이 사라지고 대신 yeoreum.archive라는 처음 보는 계정이 들어와 있습니다. 목록만 단순 비교하는 도구는 이걸 "summer_diary_22 언팔 + yeoreum.archive 신규 팔로우"로 처리합니다. 두 줄의 변동으로 보이죠.
하지만 실제로는 한 사람이 username만 바꾼 것일 수 있습니다. 그러면 같은 사건이 한 번은 언팔 목록에, 한 번은 신규 목록에 — 이렇게 이중으로 오인됩니다. 사용자 입장에서는 멀쩡한 친구가 언팔한 것처럼 보이니 기분이 상하고, 도구는 신뢰를 잃습니다. 닉변이 잦은 한국 사용자 환경에서는 이 오인이 꽤 흔합니다.
문제의 본질은 명확합니다. 목록 비교는 "이름"을 키로 삼는데, 이름은 바뀔 수 있다는 것. 그래서 저는 질문을 바꿔야 했습니다. "이름이 바뀌어도 변하지 않는 무언가가 데이터 안에 남아 있는가?" 이걸 확인하려면 먼저 내보내기 파일에 정확히 무엇이 들어 있는지부터 봐야 했습니다.
Instagram 공식 데이터 내보내기(JSON)의 팔로워 파일을 열어보면, 한 사람당 레코드는 이렇게 생겼습니다. 닉변 추적 관점에서 꼭 봐야 할 세 필드만 남기고 본 모양입니다.
{
"string_list_data": [
{
"href": "https://www.instagram.com/_u/yeoreum.archive",
"value": "yeoreum.archive",
"timestamp": 1701456789
}
]
}세 필드가 전부입니다. href는 프로필 링크, value는 현재 username, timestamp는 Unix epoch 초 단위 숫자. 여기서 제가 가장 먼저 확인한 것은 "무엇이 없는가"였습니다. Instagram 앱 내부는 사용자를 pk라고 부르는 고유 숫자 ID로 식별합니다. 닉네임을 바꿔도 이 pk는 그대로죠. 그런데 내보내기 데이터에는 이 pk가 들어 있지 않습니다. href에 담긴 것도 username 기반 경로일 뿐, 숫자 ID가 아닙니다.
이게 결정적입니다. 사람을 영구적으로 식별할 수 있는 유일한 열쇠(pk)가 빠져 있으니, value가 다르면 그 둘이 같은 사람인지 다른 사람인지 데이터만 보고는 단정할 수 없습니다. JSON 파일의 전체 구조와 각 필드의 의미를 더 깊이 알고 싶다면 내보내기 JSON 구조 해부 글에서 자세히 다뤘으니 참고하세요. 이 글에서는 "닉변을 추적할 단서가 되는가"라는 각도로만 데이터를 봅니다.
그렇다면 남는 후보는 timestamp 하나입니다. 이 값이 닉변에도 변하지 않는다면, pk를 대신할 약한 식별자로 쓸 수 있을지 모릅니다. 하지만 그 전에, 더 정공법인 "공식 API로 pk를 받아오는 길"이 정말 닫혀 있는지부터 확인해야 했습니다.
"앱 내부엔 pk가 있다며. 그럼 API로 받아오면 되잖아?" 저도 그렇게 생각하고 세 갈래 길을 모두 확인했습니다. 결론부터 말하면 셋 다 막혀 있습니다.
개인 계정의 기본 정보를 다루던 Instagram Basic Display API는 Meta의 2024년 9월 공지에 따라 2024년 12월 4일 자로 완전히 종료되었습니다. 애초에 이 API도 본인 계정의 미디어 정도만 다뤘지, 타인의 팔로워 목록이나 pk를 주는 용도가 아니었습니다. 지금은 그마저도 사라졌습니다.
현재 살아 있는 것은 Instagram Graph API입니다. 하지만 이건 비즈니스·크리에이터 계정을 Facebook 페이지에 연결한 경우에만 쓸 수 있고, 무엇보다 IG User 레퍼런스를 보면 팔로워 수(followers_count)는 주지만 팔로워 개개인의 목록을 주는 엣지 자체가 없습니다. 누가 나를 팔로우하는지 이름 하나하나를 받아올 공식 통로가 처음부터 설계에 없는 것입니다. pk는 더더욱 받을 수 없습니다.
남는 건 화면을 긁어오는 스크래핑인데, 이건 Instagram 이용약관의 자동 수집 금지 조항에 정면으로 위배됩니다. 사용자 계정 정지 위험은 물론이고, 서비스로 제공하기엔 윤리적으로도 선을 넘습니다. 그래서 저는 스크래핑을 검토 대상에서 아예 제외했습니다. CheckMate가 공식 내보내기 파일만 다루는 이유도 같습니다.
공식 길이 막혔으니 남은 단서는 데이터 안의 timestamp뿐이었습니다. 그래서 가설을 세우고 직접 테스트했습니다. 테스트 계정으로 다른 계정을 팔로우해 두고, 그 계정의 username을 바꾼 뒤, 닉변 전과 후 두 번 내보내기를 받아 비교한 것입니다.
결과는 명확했습니다. value(username)는 당연히 바뀌었지만, 같은 팔로우 관계의 timestamp는 1초도 다르지 않고 그대로였습니다. 곰곰이 생각해보면 당연합니다. timestamp는 "팔로우 버튼을 누른 시각"을 기록한 이벤트 시각이지, 계정의 현재 속성이 아니기 때문입니다. 상대가 이름을 100번 바꿔도 "내가 그를 팔로우한 시점"은 과거의 사실이라 변할 수 없습니다.
여기서 추정 알고리즘이 나옵니다. 두 시점을 비교해서 "사라진 계정"들과 "새로 나타난 계정"들을 모은 뒤, 양쪽에서 timestamp가 정확히 일치하는 1:1 쌍을 찾으면, 그 둘은 같은 사람이 이름만 바꾼 것으로 추정할 수 있습니다. CheckMate의 비교 로직(compareSnapshots)이 정확히 이렇게 동작합니다. 사라진 계정과 나타난 계정을 timestamp로 묶어보고, 한 시각에 정확히 하나씩만 대응될 때만 닉변 추정으로 분류합니다.
핵심 질문은 이겁니다. 서로 다른 두 사람이 우연히 똑같은 초에 팔로우되어 닉변으로 잘못 묶일 확률은 얼마나 될까? timestamp는 초 단위라 하루에 86,400개의 칸이 있고, 1년이면 약 3,150만 개, 3년이면 약 9,500만 개의 서로 다른 초가 존재합니다.
사라진 계정이 m명, 새로 나타난 계정이 n명, 팔로우 이력이 펼쳐진 전체 기간이 T초라고 하면, timestamp가 거의 균등하게 흩어져 있다는 가정 아래 기대되는 우연한 충돌(오탐) 횟수는 대략 다음과 같습니다.
기대 오탐 횟수 ≈ m × n / T m = 사라진 계정 수 n = 새로 나타난 계정 수 T = 팔로우 이력이 펼쳐진 전체 기간(초)
직관적으로, m명과 n명을 짝지을 수 있는 경우의 수는 m×n가지이고, 임의의 한 쌍이 같은 초에 떨어질 확률은 약 1/T이기 때문입니다. 실제 숫자를 넣어봤습니다.
| 시나리오 | m × n | 이력 기간 T | 기대 오탐 ≈ m×n/T |
|---|---|---|---|
| 소규모 변동 (m=n=20), 3년 이력 | 400 | 약 9.5×107초 | 약 0.000004 |
| 대규모 변동 (m=n=100), 1년 이력 | 10,000 | 약 3.15×107초 | 약 0.0003 |
해석하면, 3년치 이력에서 20명이 사라지고 20명이 새로 들어온 일반적인 상황에서, 두 명이 우연히 같은 초에 떨어져 닉변으로 오인될 기대 횟수는 약 0.000004회입니다. 100만 명이 같은 분석을 돌려도 오탐 몇 건 나올까 말까 한 수준이죠. 변동이 100명으로 커지고 이력이 1년으로 짧아져도 0.0003회, 여전히 사실상 0에 가깝습니다. 즉 일반 개인 계정 규모에서 timestamp 우연 충돌은 무시해도 좋습니다.
이 추정 기법은 만능이 아닙니다. 어디서 틀릴 수 있는지 정확히 알아야 결과를 올바르게 읽을 수 있으므로, 세 가지 한계를 숨김없이 적습니다.
상대가 나를 언팔로우했다가 다시 팔로우하면, 그 순간 timestamp가 새 시각으로 갱신됩니다. 그러면 닉변을 했더라도 옛 timestamp와 일치하지 않아 매칭에 실패합니다. 같은 사람인데도 언팔+신규로 표시되는 거짓 음성(놓침)이죠. 이건 데이터 구조상 어쩔 수 없습니다 — 재팔로우는 timestamp 관점에서 정말로 "새 사건"이니까요.
앞 장에서 짚었듯, 같은 초에 사라진 계정과 나타난 계정이 둘 이상씩 묶이면 누가 누구로 바뀐 건지 특정할 수 없습니다. 이때 알고리즘은 억지로 짝짓지 않고 "모호" 항목으로 분리해 "이 시각에 이런 변동이 있었다"고만 보여줍니다. 오답을 자신 있게 내미는 것보다 모른다고 정직하게 말하는 편이 낫다고 봤습니다.
Instagram 전체 데이터를 받을 때 following 목록은 전체가 오지만, 공식 내보내기의 followers 목록은 약 365일 범위로 잘려 오는 경우가 있습니다. 잘린 데이터끼리 비교하면 오래된 팔로우 관계의 timestamp가 한쪽에만 존재해 매칭 자체가 성립하지 않습니다. 그래서 두 내보내기는 가능한 한 같은 옵션·같은 기간으로 받아야 추정이 정확해집니다.
이 모든 검증을 거쳐, timestamp 휴리스틱을 실제 도구로 구현했습니다. 두 시점 비교 — 언팔 추적기는 이전 내보내기와 최신 내보내기를 받아 언팔로워·신규 팔로워를 가려내고, 그 위에 닉변 추정 쌍과 모호 항목까지 따로 분리해 보여줍니다. 사용법은 단순합니다.
도구를 만들면서 경쟁 서비스도 직접 확인해봤습니다. 2026년 6월 기준으로 Toollyst와 TrackFollows를 살펴본 결과, 두 곳 모두 닉변 계정을 그냥 언팔+신규로 표시하고 추정이라는 고지나 별도 분리가 없었습니다. 사용자가 닉변을 언팔로 오해할 여지가 그대로 남아 있는 셈입니다. 도구별로 무엇을 어떻게 처리하는지 9개 항목으로 실측해 정리한 내용은 언팔 확인 도구 비교 글에서 다룹니다(자사 포함 비교임을 미리 밝혀둡니다).
닉변 추적은 "불가능"과 "가능" 사이 어딘가에 있습니다. 확정은 불가능하지만, 데이터에 남은 작은 단서 하나로 신뢰도 높은 추정은 가능합니다. 중요한 건 그 경계를 정직하게 긋는 것이라고 생각합니다.
상대 프로필의 "이 계정 정보"에서 이전 사용자 이름 변경 횟수는 볼 수 있지만, 구체적인 과거 닉네임과 변경 시점은 공개되지 않습니다. 내보내기 데이터에도 현재 username만 기록됩니다. 즉 공식 경로로는 "몇 번 바꿨다"까지만 알 수 있고 "무엇에서 무엇으로"는 알 수 없습니다.
아니요. 고유 ID가 없는 이상 어떤 방법도 확정이 아닌 추정입니다. 같은 초에 팔로우가 몰리는 이벤트성 상황에서는 오탐 가능성이 있어 모호 항목으로 분리합니다. 추정의 신뢰도는 계정 규모와 팔로우 이력 기간에 따라 달라집니다.
2026년 6월 기준으로 직접 확인한 Toollyst·TrackFollows는 닉변 계정을 언팔+신규로 표시하며 별도 고지가 없습니다. 자세한 비교는 언팔 도구 비교 글에서 다룹니다.