MCP 보안
관리자 로그인과 매일 만료되는 웹사이트 전용 키로 수정 권한을 제한합니다.
주소 관리
- AI코딩 연결 정보를 공개 문서, 채팅방이나 소스 저장소에 남기지 않습니다.
- 신뢰할 수 있는 AI 도구와 작업자에게만 전달합니다.
- 주소는 매일 00:00 KST에 자동 갱신되고 이전 주소는 사용할 수 없습니다.
- AI코딩 화면에서 발급한 주소는 발급한 관리자 또는 소유자 계정에 연결되며, 메모와 쪽지는 해당 계정 권한으로만 조회·변경합니다.
- 주소가 노출됐다면 재발급 버튼으로 현재 주소도 즉시 폐기합니다.
관리자 로그인
- 운영 도메인은 cake20.com의 Google 계정과 관리자 권한으로 로그인합니다.
- 운영 서버가 만드는 Google 로그인 주소와 완료 redirect는 공용 Hub 주소를 사용하며 127.0.0.1이나 localhost를 외부 브라우저에 노출하지 않습니다.
- localhost는 .env의 12자리 이상 MANAGER_PASSWORD로 로그인합니다.
- 로컬 로그인 세션은 HttpOnly 쿠키로 30일 동안 유지됩니다.
- 로컬에서 5회 이상 실패하면 해당 주소의 로그인을 15분 동안 제한합니다.
작업 상태와 자동 종료
MCP 작업은 잠금 없이 수정 중 상태만 기록하며, 새 begin_work는 남아 있는 미완료 상태를 새 작업으로 교체합니다. 사용자는 에디터에서 함께 수정할 수 있습니다. 텍스트와 바이너리 저장은 최신 전체 내용을 적용하므로 AI는 수정 직전에 현재 파일을 다시 읽고 다른 변경을 보존합니다. MCP와 로컬 폴더·파일의 생성, 이름 변경, 내용 변경과 삭제는 파일 목록과 열린 탭에 실시간으로 반영합니다. begin_work 후 같은 AI의 일반 MCP 요청·알림 또는 ping 중 하나만 와도 활동 신호로 처리합니다. 요청이 실행 중인 경우도 활동으로 보며, 마지막 일반 요청 후 3분 안에 새 요청이 없을 때만 AI가 별도 ping 도구를 직접 호출합니다. 오래 생각하거나 계획·대기하기 전에는 ping을 먼저 보내고, 무신호 상태가 계속되면 3분마다 반복합니다.
- 단순 연결 유지, HTTP keep-alive, 열린 연결, 로컬 분석과 셸 명령은 활동 신호가 아닙니다.
- 알려진 서버 작업이 진행 중이지 않고 20분 동안 활동이 없으면 timeout으로 종료합니다.
- timeout·오류·정상 완료 즉시 수정 상태를 마치며 사용자 확인을 기다리지 않습니다.
- timeout과 오류는 에디터에 빨간 알림으로 남고 사용자가 닫으면 사라집니다.
- 사용자가 정지 버튼을 누르면 진행 중인 AI·MCP 요청과 Preview를 즉시 종료합니다.
- 자동 종료된 기존 AI가 돌아오면 새 사용자 요청으로 begin_work를 다시 호출해야 합니다.
서버 안전장치
- 웹사이트 ID와 주소에 포함된 당일 48자리 제어키를 모두 검증합니다.
- 허용하지 않은 Origin 요청을 차단합니다.
- 웹사이트 루트 밖의 경로와 심볼릭 링크 접근을 차단합니다.
- 행 전용 CRUD 도구는 파라미터와 기본 키로 대상 범위를 제한합니다.
- 범용 SQL은 웹사이트 전용 비로그인 역할로 권한을 낮춘 뒤 실행합니다.
- execute_db 세션은 다른 웹사이트나 서버 권한 역할로 전환할 수 없습니다.
- DB 조회는 웹사이트 전용 역할, Redis 조회는 웹사이트 전용 접두어 안에서만 실행됩니다. 공유 데이터 쓰기는 현재 사용자 요청에 포함된 범위로 제한합니다.
- DB 쓰기는 변경 직전 자동 백업하고 실패 시 복구하며 release를 멈추지 않습니다. 넓은 변경은 create_site_backup으로 별도 복구 지점을 만듭니다.
- 레디스 키에는 웹사이트 전용 접두어를 서버에서 강제로 붙이고 다른 키를 받는 명령은 제공하지 않습니다.
- clear_redis도 웹사이트 접두어와 일치하는 키만 검색해 삭제합니다.
- 행 전용 CRUD 도구는 한 번에 100행으로 제한하고 실패 시 전체 롤백합니다.
- 수정·삭제는 완전한 기본 키를 요구하며 삭제는 현재 요청이 정확히 그 대상을 포함한 경우에만 실행합니다.
- 텍스트와 바이너리 저장은 가장 최근 전체 내용을 적용합니다. AI는 쓰기 직전에 파일을 다시 읽어 다른 변경을 보존해야 합니다.
- MCP가 begin_work를 호출하면 잠금 없이 수정 중 상태를 기록하며, 새 작업은 남아 있는 미완료 상태를 교체합니다. 사용자는 에디터에서 함께 수정할 수 있고, 같은 파일의 늦은 저장이 최신 내용이 되므로 쓰기 직전 상태를 확인해야 합니다.
- finish_work가 호출되면 완료 내역을 에디터에 누적하고 수정 상태를 즉시 마칩니다. 사용자의 별도 확인 없이 다음 MCP 작업을 시작할 수 있습니다.
- 복구할 수 없는 오류는 finish_work의 status error로 종료하고, 알려진 서버 작업 없이 20분 동안 MCP 활동 신호가 없으면 timeout으로 종료합니다. 오류와 timeout도 사용자 확인 없이 즉시 수정 상태를 마칩니다.
- 에디터에는 AI·모델 이름, 접속 IP, 작업 내용과 경과 시간이 표시되며 사용자는 정지 버튼으로 AI·MCP 요청과 Preview를 즉시 종료할 수 있습니다.
- 중단된 MCP 작업은 다음 변경 도구 호출에서 취소 사실을 전달받으며, 새 사용자 요청 없이는 작업을 다시 시작할 수 없습니다.
- 유효한 만료 주소는 MCP_ADDRESS_EXPIRED와 만료 시각·웹사이트 이름을 반환하며, 폐기되거나 잘못된 주소는 MCP_ADDRESS_REVOKED_OR_INVALID로 구분합니다. 임의의 잘못된 키에는 웹사이트 이름을 노출하지 않습니다.
- read_asset·write_asset·upload_files는 파일당 2MB 이하 바이너리를 처리하고, upload_files는 새 경로만 만들며 기존 파일을 덮어쓰지 않습니다.
- 바이너리 MCP 도구는 이미지, 폰트, PDF, 오디오와 비디오 확장자만 허용해 코드 파일이 lint와 텍스트 저장 규칙을 우회하지 못하게 합니다.
- request_service는 해당 웹사이트의 loopback 주소만 호출하고 Host, forwarded, client IP 관련 header를 차단합니다.
- get_settings는 Secret 이름만 반환하며 update_settings와 활동 기록은 Secret 값을 남기지 않습니다.
- Git 도구는 연결된 웹사이트의 로컬 저장소에서만 실행되며 임의 명령과 원격 접근을 제공하지 않습니다.
- git_restore는 전체 커밋 SHA, 명시적 확인과 웹사이트 내부 경로를 요구하며 복원 전 현재 변경을 자동 커밋합니다.
- MCP 파일별 2MB 및 관리자 전체 용량 제한을 적용합니다.
- 메모와 쪽지 도구는 서명된 내부 AI 계정 또는 MCP 주소를 발급한 계정을 사용하며 관리자·소유자의 메모 범위와 쪽지 대상을 서버에서 강제합니다.
- DB·Redis·파일·설정·Git·빌드·배포·작업 상태를 바꾸는 MCP 도구와 실패한 요청만 안전한 대상 정보와 함께 웹사이트 통합 활동 기록에 저장합니다.