claude.ai와 Claude Code, 뭐가 다를까 — 컨텍스트 윈도우의 정체
저는 웹브라우저의 claude.ai와 터미널의 Claude Code를 거의 매일 번갈아 씁니다. 그러면서도 둘이 정확히 무엇이 다른지 — 특히 둘의 컨텍스트 윈도우가 어떻게 다른지는 막연히 "하나는 웹이고 하나는 로컬이지" 정도로 뭉뚱그려둔 채 써왔습니다. 그러다 문득 이 둘을 제대로 구별해보고 싶어졌고, 더 정확한 내용을 직접 조사해보기로 했습니다. 마침 어느 대화에서 "컨텍스트 윈도우"라는 말이 나왔는데, 그 한 단어를 붙잡고 파고들다 보니 제가 한 단어로 뭉쳐두었던 것이 사실은 서로 다른 두 가지를 가리키고 있었습니다. 이 글은 그렇게 더 정확히 알고 싶어 조사하며 오해를 한 겹씩 벗겨낸 기록입니다. 끝에 가서는 "AI가 대화를 기억한다"는 말 자체가 착시였다는 결론에 닿습니다.
같은 '컨텍스트'라는 말이 두 갈래였다
가장 먼저 걸린 것은 용어였습니다. 저는 "컨텍스트"라는 말을 한 가지 뜻으로 쓰고 있다고 믿었는데, 곰곰이 생각해보니 그 말이 두 가지 다른 것을 동시에 가리키고 있었습니다. 이걸 갈라놓지 않으면 이후 이야기가 계속 엉킵니다.
- 컨텍스트 윈도우(Context Window) — 모델이 한 번에 읽어들일 수 있는 토큰의 양, 즉 입력의 한계입니다. 이 글이 주로 들여다볼 대상입니다.
- 실행 환경 컨텍스트 — 그 환경이 실제로 접근할 수 있는 파일·도구·정보의 범위입니다. 모델의 머릿속 용량이 아니라, 그 모델이 놓인 자리의 권한에 가까운 이야기입니다.
둘은 완전히 다른 층위의 이야기인데도 "컨텍스트"라는 같은 단어를 쓰는 바람에 자주 뒤섞입니다. 그래서 먼저 둘을 갈라놓고 시작하기로 했습니다.
두뇌가 놓인 자리부터 다르다 — 실행 환경
웹과 로컬의 가장 눈에 띄는 차이는 사실 컨텍스트 윈도우가 아니라 이 실행 환경 쪽이었습니다. claude.ai의 채팅은 Anthropic의 서버 어딘가, 격리된 샌드박스 안에서 돕니다. 제 노트북의 파일시스템이나 셸, git에 직접 손을 댈 수 없습니다. 쓸 수 있는 도구도 Anthropic이 미리 정해둔 셋(웹 검색 같은)으로 한정되고, 무엇을 하든 그 부수효과는 대화창 안에 갇힙니다.
반면 로컬의 Claude Code는 제 머신 위에서 직접 돕니다. 파일을 읽고 쓰고, Bash로 실제 git이나 빌드, DB 명령을 돌리고, 제가 붙여둔 MCP 서버나 직접 만든 스킬·에이전트를 불러옵니다. 현재 작업 디렉토리, 운영체제, git 상태, 환경변수, 그리고 프로젝트의 CLAUDE.md까지를 자신이 놓인 환경 컨텍스트로 인식합니다. 실제 파일과 DB와 배포에 영향을 줄 수 있으니, 그래서 권한과 hook으로 그 손을 단속해야 합니다.
한 줄로 비유하자면 이렇습니다. 웹의 Claude는 "대화 상자 안에 갇힌 두뇌"이고, 로컬의 Claude Code는 "내 컴퓨터에 손발이 달린 두뇌"입니다. 똑같이 똑똑하더라도, 하나는 말로만 거들 수 있고 다른 하나는 직접 손을 댈 수 있습니다.
다만 여기엔 경계가 흐려지는 지점이 하나 있습니다. "웹브라우저 안의 Claude"가 claude.ai/code 같은 원격 환경이라면, 그건 파일과 셸과 git을 갖긴 합니다. 그래도 결정적인 차이는 남습니다. 그곳이 내 Mac이 아니라 원격 컨테이너라는 점입니다. 제 머신에서 도는 LaunchAgent나 로컬 DB로 뚫어둔 터널, 데스크톱 연동 같은 것은 거기서는 닿을 수 없습니다. 결국 "어느 머신 위에 손발이 달려 있느냐"가 환경 컨텍스트의 진짜 경계인 셈입니다.
가장 큰 오해 — '기억'이 아니라 '매 턴 다시 먹임'
여기서부터가 이 글의 척추입니다. 저를 포함해 많은 사람이 당연하게 여기는 한 가지가 있습니다. "대화를 이어가면 AI가 앞에서 한 말을 기억한다"는 믿음입니다. 그런데 따져보니 이게 사실과 꽤 어긋나 있었습니다.
모델 자체는 무상태(stateless)입니다. 한 턴과 다음 턴 사이에 아무것도 기억하지 않습니다. 방금 나눈 대화조차 모델 입장에서는 끝나는 순간 사라집니다. 그렇다면 어떻게 대화가 이어지는 것처럼 보일까요. 비밀은 모델이 아니라 그 앞단의 클라이언트에 있습니다. 제가 새 메시지를 보낼 때마다, 클라이언트는 모델에게 이런 묶음을 통째로 다시 건넵니다.
[시스템 프롬프트] + [지금까지의 전체 대화 1~N] + [방금 보낸 N+1번 메시지]
모델은 이 묶음을 매번 처음 보는 것처럼 처음부터 끝까지 다시 읽습니다. 그러니 "이전 대화를 기억한다"는 건 정확히 말하면 기억이 아니라, "클라이언트가 매 턴 전체 기록을 다시 첨부한다"는 착시입니다. 모델이 과거를 떠올리는 게 아니라, 매 턴 과거 전체를 다시 읽도록 떠먹여지고 있는 것입니다.
이 사실을 받아들이고 나니, 평소 당연하게 여기던 또 하나가 같은 그림으로 맞물렸습니다. 로컬에서 CLAUDE.md에 적어둔 지침은 매 턴 컨텍스트의 맨 앞에 삽입(prepend)됩니다. 저는 이걸 대화 히스토리와는 별개의 특별한 장치라고 막연히 생각했는데, 알고 보니 둘은 정확히 같은 메커니즘이었습니다. 대화 히스토리도 결국은 매 턴 다시 끼워 넣는 텍스트일 뿐이고, CLAUDE.md도 매 턴 다시 끼워 넣는 텍스트일 뿐입니다. 둘 다 "모델이 매번 새로 읽는 입력"이라는 점에서 한 식구였던 것입니다.
그렇다면 컨텍스트 윈도우 안에서 CLAUDE.md와 대화 히스토리는 어디서 갈라지나
둘이 같은 식구라면, 다른 점은 무엇일까요. 공통점은 분명합니다. 매 턴 컨텍스트에 다시 들어간다는 것입니다. 갈라지는 지점은 그 다음입니다.
| 항목 | CLAUDE.md | 대화 히스토리 |
|---|---|---|
| 매 턴 삽입 | O | O |
| 크기 | 고정(작음) | 계속 누적(무한정 커짐) |
| 창이 찰 때 | 거의 안 건드림 | 가장 먼저 잘리거나 요약됨 |
결국 차이는 "누가 자리를 잃느냐"로 좁혀집니다. CLAUDE.md는 크기가 작고 일정해서 창이 빠듯해져도 안정적으로 살아남습니다. 반대로 대화 히스토리는 대화가 길어질수록 부피가 불어나며 창을 잡아먹다가, 결국 한계에 부딪힙니다. 그 한계를 두고 흔히 200K니 1M 토큰이니 하는 수치를 듣지만, 그건 어디까지나 예시일 뿐 제품마다 다릅니다. 중요한 건 그 다음 사실입니다. 그 한계는 웹이냐 로컬이냐 하는 실행 환경이 정하는 것이 아니라, 사용하는 모델과 플랜이 정합니다. 같은 환경이라도 모델이 바뀌면 창의 크기가 달라집니다.
창이 차면 무슨 일이 — 잘리거나, 요약되거나
그렇다면 그 한계에 실제로 부딪히면 무슨 일이 벌어질까요. 여기서 웹과 로컬이 조금 다르게 행동합니다.
claude.ai에서는 대화가 너무 길어지면 앞부분이 슬그머니 잘려 나가거나, "대화가 너무 길어졌습니다 — 새 대화를 시작하세요" 같은 안내와 함께 더 이상 이어가지 못하게 막힙니다. Claude Code는 길어지면 지금까지의 대화 일부나 전체를 요약(compaction)해서 다음 창으로 넘깁니다. 원문을 그대로 들고 가는 대신, 압축된 요약본으로 갈아 끼우는 것입니다.
방식은 달라도 본질은 같습니다. 어느 쪽이든 무한히 보존되는 것이 아니라, 창에 더 이상 들어가지 못하는 순간부터 손실이 시작됩니다. 잘리면(truncation) 그 부분은 아예 사라지고, 요약되면 디테일이 깎인 채로만 남습니다. 요약은 잘림보다 친절하지만, 어쨌든 원문이 아니라는 점에서 손실(lossy)이라는 사실은 변하지 않습니다.
창 안에 있다 ≠ 균등하게 본다
그런데 한 가지 더 짚어야 할 것이 있었습니다. 저는 "히스토리가 창 안에 들어 있기만 하면 모델이 그걸 똑같이 참고하겠지"라고 생각했는데, 이것도 사실과 달랐습니다.
히스토리가 전부 창 안에 있더라도, 모델이 모든 부분을 같은 강도로 보는 것은 아닙니다. 보통 맨 앞과 맨 끝은 또렷하게, 중간은 상대적으로 흐릿하게 봅니다. 흔히 "lost in the middle"이라 부르는 현상입니다. 그래서 긴 대화 중반에 딱 한 번 흘려둔 디테일을, 모델이 뒤에 가서 놓치는 일이 생깁니다. 분명히 같은 대화 안에서 말했는데도 말입니다.
정리하면, "창에 있다"와 "확실히 반영된다"는 같은 말이 아닙니다. 창에 담겨 있는 것은 참고될 가능성이 있다는 뜻이지, 또렷하게 반영된다는 보장은 아닙니다. 정말 놓치면 안 되는 지시일수록 중간에 한 번 던져두고 잊기보다, 살아남기 쉬운 자리에 두는 편이 낫다는 생각이 들었습니다.
새 대화는 백지 — 단 CLAUDE.md 대응물이 있다
마지막 의문은 이것이었습니다. 새 대화창을 열면 어떻게 될까요. 답은 단순합니다. 완전히 백지입니다. 옆에 켜둔 다른 대화창의 내용은 전혀 보이지 않습니다. 앞에서 본 대로 히스토리란 그 대화 안에서만 매 턴 다시 첨부되는 것이니, 창이 바뀌면 첨부할 과거도 사라지는 셈입니다.
그런데 여기서 흥미로운 대응이 보였습니다. claude.ai에도 로컬의 CLAUDE.md에 해당하는, "항상 자동으로 주입되는 컨텍스트"가 존재한다는 것입니다. 다만 이걸 두 층으로 나눠 봐야 정확합니다.
층 1은 항상 깔리는 시스템 프롬프트입니다. 웹이든 로컬이든 무조건 들어가고, Anthropic이 넣는 것이라 제가 고칠 수 없습니다. 다만 이건 "내" CLAUDE.md가 아니라 기본 설정이라는 점을 분명히 해둬야 합니다.
층 2가 제가 직접 만든 CLAUDE.md의 대응물입니다. 기본 빈 채팅에는 없지만, 아래를 설정해두면 모든 새 대화에 자동으로 주입됩니다. 로컬과 웹이 이렇게 짝을 이룹니다.
| claude.ai 기능 | Claude Code 대응 | 동작 |
|---|---|---|
| 개인 맞춤 지침(Custom Instructions) | ~/.claude/CLAUDE.md (글로벌) |
모든 새 대화에 자동 삽입 |
| Projects(프로젝트 지침·지식) | 프로젝트 CLAUDE.md |
그 프로젝트 안 모든 대화에 주입 |
| Memory(대화 간 기억) | memory/ 폴더 |
과거 대화에서 뽑은 사실을 주입 |
그래서 진짜 차이는 기능의 유무가 아니라 "어디에 저장되느냐"였습니다. 매 턴 맨 앞에 끼워 넣는다는 메커니즘은 양쪽이 똑같고, 보관 장소만 다릅니다. Claude Code는 그 지침이 제 디스크 위의 파일(/Users/.../CLAUDE.md)로 존재해서, 제가 직접 편집하고 git으로 관리합니다. claude.ai는 같은 역할의 지침이 제 Anthropic 계정, 그러니까 서버에 저장되고, 설정 화면에서 고치면 서버가 매 대화에 알아서 끼워 넣어 줍니다.
비유하자면 CLAUDE.md는 제 책상에 직접 붙여둔 메모지입니다. 제가 손으로 쓰고 떼고 관리합니다. claude.ai의 맞춤 지침은 회원가입 때 등록해둔 프로필에 가깝습니다. 서버에 저장되어 있다가 새 대화마다 자동으로 따라붙습니다. 적용되는 방식은 같고, 보관하는 장소만 다른 것입니다.
정리하며
처음엔 그저 "웹과 로컬이 뭐가 다른가"를 묻고 시작했는데, 따라가다 보니 몇 가지가 한 줄로 꿰어졌습니다.
- 한 세션 안에서는 전체 히스토리를 매 턴 다시 참고하는 게 맞습니다. 단 그건 "기억"이 아니라 "재첨부"입니다.
- 창이 차면 안정적인 CLAUDE.md보다 히스토리부터 잘리거나 요약(lossy)됩니다.
- 창 안에 있어도 중간은 흐려질 수 있습니다("lost in the middle").
- 새 대화는 백지이지만, 맞춤 지침·Projects·Memory가 CLAUDE.md 역할을 대신합니다. 메커니즘은 같고 저장 위치만 로컬 파일이냐 계정 서버냐로 갈립니다.
돌이켜 생각해보면, 이번에 제가 얻은 건 웹과 로컬의 비교표 한 장이 아니었습니다. 컨텍스트 윈도우가 무엇인지 한 번 이해하고 나면, 평소 막연하던 두 가지가 동시에 풀린다는 점이었습니다. 왜 긴 대화에서 AI가 앞을 잊는지, 그리고 왜 정말 중요한 지시는 대화 중간에 흘리기보다 CLAUDE.md나 맞춤 지침에 박아둬야 안정적인지가 같은 원리로 설명됩니다.
무엇보다, 작은 관점의 전환이 남았습니다. 저는 그동안 기계가 저를 기억해준다고 여겼는데, 사실은 매 턴 제가, 혹은 제 클라이언트가, 과거를 다시 들려주고 있었던 것입니다. 기억하는 쪽은 기계가 아니라 그 곁의 장치였다는 생각이 들었습니다. 그렇다면 무엇을 다시 들려줄지, 어디에 적어두고 자동으로 따라붙게 할지를 챙기는 일이야말로, 이 도구를 오래 잘 쓰기 위해 제가 신경 써야 할 몫이라는 결론에 닿았습니다.
관련 글
Claude Code 소스 유출이 드러낸 아키텍처 — 3편: 메모리와 컨텍스트 압축
AI 에이전트가 장시간 작업할 때 가장 큰 적은 컨텍스트 한계입니다. Claude Code는 4계층 메모리, 200K 토큰 자동 압축, 자기 치유 메모리, 지연 로딩이라는 네 가지 전략으로 이 문제를 해결합니다.
큰 작업의 거처를 챗봇 UI에서 로컬 하네스로 — 옆에서 함께 옮긴 이야기
주변에서 외부 챗봇의 커스텀 기능 위에 무거운 작업을 굴리던 분이 매번 같은 자리에서 막히는 걸 보고, 그 작업의 거처를 Claude Code 위 로컬 하네스로 옮겨드린 과정. 옆에서 본 네 가지 막힘과 함께 갖춰둔 여섯 가지 패턴을 정리했습니다.
Claude Code에서 SuperClaude 프레임워크를 걷어낸 이유 — 71KB를 5KB로
SuperClaude 프레임워크를 분석해보니, 17개 파일 71KB 중 대부분이 불필요했다. 모델이 이미 아는 원칙, 내장 규칙과의 중복, 설치되지 않은 도구 문서까지. 92% 감소시킨 정리 과정과 교훈을 정리했다.