Journey to Security/Windows OS

Windows 11 메모장의 세션 상태 자동 저장 메커니즘과 TabState 캐시 구조 분석

Cordilog 2026. 8. 23. 21:16

Windows 11의 메모장은 과거 Windows 10 이전 버전과 근본적으로 다른 동작 방식을 갖는다. 저장하지 않고 창을 닫아도 다음 실행 시 편집하던 내용이 그대로 복원되는데, 이는 Windows App SDK(WinUI 3) 기반으로 재설계된 메모장이 세션 상태 자동 저장(Tab State Persistence) 메커니즘을 탑재했기 때문이다.

이번 포스팅에서는 해당 메커니즘의 동작 원리를 알아보고, 실제 캐시가 저장되는 TabState 디렉터리의 바이너리 구조를 분석해 보기로 한다.

 

먼저 이 메커니즘의 핵심 개념인 텍스트 버퍼에 대해 알아보고, 이어서 세션 자동 저장의 4단계 동작 흐름, TabState 캐시 파일의 내부 직렬화 구조, 마지막으로 미저장 데이터 복구 방법 순으로 정리한다.

1. 텍스트 버퍼(Text Buffer)의 개념

세션 상태 자동 저장을 이해하려면 먼저 텍스트 버퍼가 무엇인지 알아야 한다.

1️⃣ 텍스트 버퍼란

텍스트 버퍼는 텍스트 편집기가 글자를 처리하기 위해 메모리(RAM) 상에 임시로 확보하는 작업용 메모리 공간이다. 사용자가 키보드로 글자를 입력하거나 파일을 열면, 시스템은 디스크에 즉시 쓰지 않고 먼저 이 텍스트 버퍼에 데이터를 올린 뒤 편집 작업을 수행한다.

2️⃣ 텍스트 버퍼가 필요한 이유

🔵 입출력(I/O) 속도 완충

디스크(SSD/HDD)는 RAM에 비해 읽기·쓰기 속도가 느리다. 한 글자를 칠 때마다 디스크에 저장하면 심각한 지연이 발생하므로, 빠른 RAM 공간인 버퍼에서 먼저 처리한다.

🔵 고속 편집 연산

글자 삽입·삭제, 블록 지정, 실행 취소(Undo/Redo)와 같은 텍스트 조작 알고리즘을 밀리초 단위 이하로 즉각 계산한다.

🔵 임시 상태 보존

사용자가 명시적으로 저장(Ctrl + S)을 누르기 전까지, 수정된 내용(Dirty Data)을 원본 파일과 분리하여 안전하게 유지하는 공간 역할을 한다.

3️⃣ 버퍼와 디스크의 관계

일반적인 편집기에서 저장하지 않은 내용은 파일이 아니라 오직 RAM의 텍스트 버퍼에만 존재한다. 전원이 꺼지면 이 버퍼는 소실된다. Windows 11 메모장의 결정적 차이는, 이 버퍼 내용을 백그라운드에서 TabState 캐시 파일로 복사해 두어 복구를 가능하게 한다는 점이다.

 

4️⃣ 텍스트 버퍼를 구현하는 주요 자료구조

텍스트 편집기 내부에서는 버퍼 데이터를 효율적으로 관리하기 위해 특화된 자료구조를 사용한다.

🔵 갭 버퍼(Gap Buffer)

텍스트 중간에 빈 공간(Gap)을 두고 커서 위치에 맞춰 갭을 이동시키며 입출력하는 구조. 전통적인 에디터(Emacs 등)가 사용한다.

🔵 피스 테이블(Piece Table)

원본 버퍼(읽기 전용)와 추가 버퍼(추가 전용)를 분리하고, 변경 이력을 인덱스 노드로 관리하는 구조. VS Code 등 최신 에디터가 사용한다.

🔵 로프(Rope)

긴 문자열을 작은 노드로 쪼개어 이진 트리 형태로 연결해, 대용량 파일 편집 시 성능 저하를 방지하는 구조.

2. 세션 상태 자동 저장(Tab State Persistence) 동작 원리

Windows 11 메모장은 원본 파일을 직접 수정하지 않고, 편집 중인 텍스트 버퍼와 탭 상태를 별도의 로컬 캐시 파일에 실시간으로 보관한다. 이 메커니즘은 네 단계로 동작한다.

1️⃣ 로컬 캐시(TabState)에 실시간 스냅샷 기록

텍스트를 입력하거나 탭을 열면, 메모장은 이를 시스템 임시 영역에 바이너리 및 텍스트 캐시 형태로 기록한다.

  • 저장 위치: %LocalAppData%\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState
  • 저장 데이터: 각 탭의 텍스트 버퍼(수정분), 커서 위치, 스크롤 상태, 원본 파일 경로, 저장되지 않은 신규 문서 여부

2️⃣ 원본 파일과 분리된 가상 버퍼 구조

실제 디스크 상의 .txt 파일을 덮어쓰는 방식이 아니다. 원본 파일은 그대로 둔 채 메모장 앱 내부의 수정 델타(Delta)와 미저장 버퍼만 캐시에 유지한다. 따라서 원본 파일 손상 위험 없이 앱 재실행 시 이전 작업 화면을 그대로 재구성한다.

3️⃣ 윈도우 앱 수명 주기(App Lifecycle) 연동

Windows App SDK(WinUI 3) 기반으로 재설계된 메모장은 OS의 수명 주기 이벤트를 감지한다. 사용자가 창을 닫거나 시스템 종료·재부팅 신호(WM_QUERYENDSESSION, Suspend 등)가 발생하면, 메모리에 머물던 최신 버퍼를 즉시 디스크의 TabState 캐시 파일로 플러시(Flush)한 뒤 안전하게 프로세스를 종료한다.

4️⃣ 시작 시 캐시 역직렬화(Deserialization)

PC가 재부팅되거나 메모장이 다시 실행되면, 메모장은 기본 설정에 따라 TabState 폴더를 스캔하여 직렬화되어 있던 탭 목록과 텍스트 버퍼를 읽어와 닫기 직전 화면을 복원한다.

5️⃣ 자동 저장 동작 비활성화

이 동작을 끄고 기존 Windows 10 이전 메모장처럼 매번 빈 창으로 시작하게 하려면, 메모장 오른쪽 상단 [설정(톱니바퀴)] → [메모장이 시작될 때] 항목을 '새 창 열기'로 변경한다.

3. TabState 캐시 파일의 저장 구조

세션 캐시는 로컬 패키지 디렉터리에 GUID 기반의 바이너리(.bin) 파일로 저장되며, 각 파일은 메타데이터 헤더와 텍스트 버퍼 영역으로 구분된 직렬화(Serialization) 구조를 갖는다.

1️⃣ 기본 저장 경로

%LocalAppData%\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState

 

실제 전체 경로는 다음과 같다.

C:\Users\<사용자명>\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState

2️⃣ 폴더 내 파일 구성

TabState 폴더 안에는 메모장에 열려 있는 탭 수와 창 상태에 따라 다음과 같은 파일이 생성된다.

🔵 <GUID>.bin

개별 탭의 메타데이터(커서 위치, 원본 파일 경로, 인코딩)와 기본 텍스트 버퍼가 저장되는 메인 파일.

🔵 <GUID>.0.bin / <GUID>.1.bin

사용자가 텍스트를 실시간으로 입력·수정할 때 발생하는 변경분(델타 버퍼) 및 복구용 섀도우 복사본.

🔵 WindowState.bin

메모장 창의 화면 좌표, 크기, 열려 있는 탭의 순서, 현재 활성화된 탭의 GUID 인덱스를 관리하는 파일.

3️⃣ 개별 <GUID>.bin 파일의 내부 바이너리 구조

각 탭 바이너리 파일은 리틀 엔디언(Little-Endian) 포맷으로 기록되며, 크게 헤더, 메타데이터, 텍스트 페이로드의 3단계 구조로 구성된다.

각 영역의 상세 구성은 다음과 같다.

🔵 헤더(Header)

매직 바이트(Signature)는 이 파일이 메모장 탭 상태 파일임을 식별하는 시그니처로, 버전에 따라 NP(0x4E 0x50) 등으로 기록된다. 포맷 버전(Format Version)은 직렬화 포맷의 버전 번호를 담는다.

🔵 메타데이터(Metadata)

파일 속성 플래그는 새 문서(제목 없음) 여부와 원본 파일 대비 수정(Dirty) 여부를 표시한다. 원본 파일이 있는 경우 경로 문자열 길이와 UTF-16LE로 인코딩된 전체 경로를 저장하며, 새 문서면 0으로 기록된다. 파일 무결성 해시·타임스탬프는 외부 프로세스에 의한 변조를 감지하기 위한 원본 파일의 수정 시간이다. 이 외에 텍스트 인코딩(UTF-8, UTF-16, ANSI 등)과 줄 바꿈 방식(CRLF, LF), 캐럿 오프셋과 텍스트 선택 영역, 뷰포트 스크롤 값을 담는다.

🔵 페이로드(Payload)

텍스트 길이 필드는 뒤따르는 버퍼의 바이트·문자 수를 지정하고, 텍스트 콘텐츠 영역에 사용자가 작성 중인 실제 텍스트 원본 데이터가 담긴다. 실행 취소(Undo) 청크는 직전 입력 상태 복원을 위한 히스토리 버퍼다.

4. 미저장 데이터 복구 및 확인 방법

저장하지 않고 닫힌 메모장 내용을 수동으로 확인하거나 복구해야 하는 경우, 다음 절차를 따른다.

 

1) 메모장 프로세스를 완전히 종료한다.

2) TabState 폴더로 이동한다.

C:\Users\<사용자명>\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState

 

3) 용량이 0KB가 아닌 <GUID>.bin 또는 <GUID>.0.bin 파일을 HxD(Hex Editor)나 일반 텍스트 편집기로 연다.

4) 헤더와 메타데이터 바이트 건너편 영역에서 유니코드로 인코딩된 작성 내용 텍스트를 직접 추출한다.

 

이 구조는 편의성을 제공하는 동시에 보안·포렌식 관점에서 중요한 의미를 갖는다. 사용자가 저장하지 않고 닫은 민감한 텍스트가 평문에 가까운 형태로 로컬 디스크에 잔존하므로, 디지털 포렌식에서는 유효한 증거 소스가 되고, 반대로 공유 PC 환경에서는 정보 노출 경로가 된다.