내보내기 파일 10개 전수 해부
— fbid는 어디에 있고 어디에 없나
CheckMate 운영자 · 발행 · 데이터 기준 2026-08-18 내보내기 · 표본: 운영자 본인 계정 1개
Instagram이 내보내기 파일의 형식을 바꾸고 있다는 건 알려져 있었지만, 한 ZIP 안에서 어떤 파일이 새 형식이고 어떤 파일이 옛 형식인지를 정리한 자료는 찾기 어려웠습니다. 그래서 connections/followers_and_following/ 폴더의 파일 10개를 전부 열어 항목 수, 형식, 그리고 계정 고유 ID(fbid) 유무를 셌습니다. 결론은 단순하고 조금 불편합니다. 언팔 확인에 쓰는 두 파일에만 fbid가 없습니다.
실측 요약 (2026-08-18 내보내기, 본인 계정 1개)
- 10개 파일 중 8개는 신포맷(label_values + fbid), 항목 993건 전부 fbid 보유
- followers_1.json(543)·following.json(565)만 구포맷(string_list_data), fbid 0건
- 같은 날 같은 요청으로 받은 한 ZIP 안에서 두 형식이 공존
파일별 결과
| 파일 | 항목 수 | 형식 | fbid |
|---|---|---|---|
| followers_1.json | 543 | 구 (string_list_data) | 없음 |
| following.json | 565 | 구 (string_list_data) | 없음 |
| removed_suggestions.json | 893 | 신 (label_values) | 893건 전부 |
| close_friends.json | 71 | 신 (label_values) | 71건 전부 |
| hide_story_from.json | 12 | 신 (label_values) | 12건 전부 |
| recently_unfollowed_profiles.json | 8 | 신 (label_values) | 8건 전부 |
| recent_follow_requests.json | 5 | 신 (label_values) | 5건 전부 |
| blocked_profiles.json | 2 | 신 (label_values) | 2건 전부 |
| restricted_profiles.json | 2 | 신 (label_values) | 2건 전부 |
| follow_requests_you've_received.json | 0 | (비어 있음) | — |
수치는 각 파일을 JSON으로 읽어 최상위 배열(래퍼 객체면 첫 배열)의 길이를 세고, 항목마다 string_list_data 키가 있으면 구포맷, label_values 키가 있으면 신포맷으로 분류한 것입니다. 항목 하나가 두 키를 동시에 가진 경우는 없었습니다.
두 형식은 실제로 이렇게 생겼다
구포맷 — followers_1.json의 항목 하나
{
"title": "",
"media_list_data": [],
"string_list_data": [
{
"href": "https://www.instagram.com/example_user",
"value": "example_user",
"timestamp": 1786714026
}
]
}식별자는 value(사용자명)와 href(프로필 URL) 둘뿐이고, 둘 다 같은 사용자명에서 파생됩니다. following.json은 title에 사용자명이 들어가고 value가 없으며 href가 /_u/사용자명 형태라는 점만 다릅니다.
신포맷 — recently_unfollowed_profiles.json의 항목 하나
{
"timestamp": 1786438546,
"media": [],
"label_values": [
{ "label": "URL", "value": "https://linktr.ee/..." },
{ "label": "ì´ë¦„", "value": "..." },
{ "label": "ì‚¬ìš©ìž ì´ë¦„", "value": "atwosomeplace_official" }
],
"fbid": "17841403294706765"
}라벨이 깨져 보이는 건 파일 자체가 UTF-8 바이트를 latin1로 잘못 적어 둔 것입니다(디코딩하면 "이름", "사용자 이름"). 중요한 건 마지막 줄의 fbid입니다. 이 값은 사용자명이 바뀌어도 변하지 않는 계정 고유 번호입니다.
왜 이 차이가 "닉네임 변경 추적"을 결정하나
언팔 확인의 핵심은 "내가 팔로우하는 A가 나를 팔로우하는 목록에 있는가"를 맞춰보는 것입니다. 비교 키가 사용자명뿐이면, A가 사용자명을 바꾼 순간 두 목록에서 다른 사람처럼 보입니다. 이때 fbid가 있으면 사용자명이 달라도 같은 계정으로 잇습니다. 실제로 CheckMate 파서는 fbid를 최우선 키로 쓰도록 만들어져 있습니다(src/lib/analyzer.ts).
문제는 표에서 보듯 팔로워·팔로잉 두 파일에 fbid가 없다는 점입니다. 그 결과:
- 사용자명을 바꾼 계정은 파일만으로는 같은 사람임을 확정할 수 없습니다. 어떤 도구도 이 파일에서는 마찬가지입니다.
- 구포맷 항목의 value/title과 href는 같은 사용자명에서 나오므로, 둘을 비교해 "변경 여부"를 뽑는 방식은 구조적으로 항상 일치합니다. 이 파일에서 그 비교로 닉변을 잡을 수 있다는 설명은 맞지 않습니다.
- CheckMate가 결과에 "닉네임 변경 가능성"이라고만 표기하고 확정 판정을 내리지 않는 이유가 이것입니다. 비활성화·탈퇴도 같은 이유로 파일만으로는 구분할 수 없습니다.
직접 확인하는 법
import json, os
B = 'connections/followers_and_following/'
for fn in sorted(os.listdir(B)):
d = json.load(open(B + fn))
items = d if isinstance(d, list) else next(v for v in d.values() if isinstance(v, list))
old = sum('string_list_data' in it for it in items)
new = sum('label_values' in it for it in items)
fbid = sum(bool(it.get('fbid')) for it in items)
print(f'{fn:40} n={len(items):4} old={old:4} new={new:4} fbid={fbid:4}')ZIP을 풀고 위 스크립트를 connections 폴더 상위에서 실행하면 이 글의 표와 같은 형식으로 출력됩니다. CheckMate에 올려도 같은 파서가 돌지만, 파일은 브라우저 밖으로 나가지 않으므로 구조 확인 자체는 로컬 스크립트가 더 빠릅니다.
덤으로 알게 된 것
- removed_suggestions.json이 893건으로 가장 큽니다. "추천 숨기기"를 누른 계정이 전부 fbid와 함께 남아 있습니다.
- recently_unfollowed_profiles.json은 내가 최근 언팔한 8명입니다. 나를 언팔한 사람 목록이 아닙니다. 이름 때문에 자주 오해되는 파일입니다.
- 신포맷 파일의 timestamp는 항목 최상위에 있고, 구포맷은 string_list_data[0].timestamp에 있습니다. 두 곳 모두 unix 초 단위였습니다.
자주 묻는 질문
fbid가 무엇이고 왜 중요한가요?
사용자명이 바뀌어도 변하지 않는 계정 고유 번호입니다. 두 목록을 이 값으로 맞추면 닉네임이 바뀐 계정도 같은 사람으로 이어집니다. CheckMate 파서는 fbid가 있으면 최우선 키로 씁니다.
팔로워·팔로잉 파일에는 왜 fbid가 없나요?
이 계정의 2026-08-18 내보내기에서 두 파일만 구형 형식이었습니다. Meta가 파일 단위로 형식을 바꾸는 중으로 보이며, 다른 시점·계정에서는 다를 수 있습니다. 본문 스크립트로 본인 파일을 직접 확인할 수 있습니다.
recently_unfollowed_profiles.json은 나를 언팔한 사람인가요?
아닙니다. 내가 최근에 언팔한 계정 목록입니다. 나를 언팔한 사람은 Instagram이 기록해 주지 않으며 두 시점의 팔로워 목록 비교로만 추정할 수 있습니다.