OpenClaw(구 Clawdbot), 24시간 돌아가는 개인 AI 비서
요즘 개발자들 사이에서 OpenClaw가 화제다. GitHub 스타가 몇 주 만에 100,000개를 넘겼다. 대체 뭐길래 이렇게 난리인지 살펴봤다.
OpenClaw가 뭔가
한마디로 "Claude with hands"다. 그냥 대화만 하는 ChatGPT 같은 챗봇이 아니라, 실제로 뭔가를 실행해주는 AI 에이전트다.
WhatsApp이나 Telegram으로 "내일 일정 뭐 있어?"라고 물어보면 Google Calendar API 호출해서 알려준다. "테슬라 주가 5% 떨어지면 알려줘"라고 하면 조건 설정해두고 실제로 알림을 보내준다. 이메일 요약, 리마인더 설정, 심지어 터미널 명령 실행까지 가능하다.
원래 이름은 Clawdbot이었는데, Anthropic에서 "Claude"랑 너무 비슷하다고 상표권 요청을 해서 Moltbot으로 바뀌었다가, 최종적으로 OpenClaw로 정착했다.
설치는 간단하다
Node.js 22 이상이 필요하고, Windows는 WSL2를 써야 한다.
npm install -g openclaw@latest
openclaw onboard --install-daemon
openclaw onboard 실행하면 설정 마법사가 뜬다. Anthropic API 키 입력하고, 연결할 채널(WhatsApp, Telegram, Discord 등) 선택하면 끝이다. Docker로 설치하는 방법도 있다.
Claude Pro나 Max 구독이 있으면 claude setup-token 으로 토큰 생성해서 API 비용 없이 쓸 수도 있다.
능동적으로 먼저 연락한다
일반 챗봇은 내가 말 걸어야 답한다. OpenClaw는 설정해두면 먼저 연락한다.
작동 방식은 크게 세 가지다. 첫째는 Cron 으로, "매일 아침 8시에 이메일 요약해줘" 같은 정해진 시간 작업이다. 둘째는 Heartbeat 로, 30분마다 깨어나서 조건을 체크하고 임계값 넘으면 알려주는 방식이다. 셋째는 Webhook 으로, GitHub PR 머지되면 알림 같은 외부 이벤트 트리거다.
복잡한 설정 파일 만들 필요 없이, 채팅으로 "매일 아침 8시에 중요한 이메일 요약해서 알려줘"라고 말하면 알아서 설정해준다.
이메일, 캘린더는 API로 연동
Gmail, Google Calendar, GitHub, Slack 같은 서비스는 각각의 API로 연동된다. Skills 시스템으로 모듈화되어 있어서 필요한 것만 붙이면 된다.
API가 없는 서비스는 브라우저 자동화로 처리한다. 항공편 체크인이나 특정 웹사이트에서 데이터 긁어오기 같은 작업이 여기 해당한다.
Gateway가 모든 것을 연결한다
OpenClaw의 핵심은 Gateway 다. 모든 메시징 채널 연결을 유지하고, 메시지를 받아서 AI에게 전달하고, 응답을 다시 보내는 중앙 허브 역할을 한다.
Gateway는 ws://127.0.0.1:18789 에서 WebSocket 데몬으로 돌아간다. 백그라운드에서 24시간 실행되면서 WhatsApp, Telegram, Slack, Discord, iMessage 등 모든 채널 연결을 동시에 유지한다. 세션 관리, 스케줄링(Cron, Heartbeat), 보안 인증도 전부 Gateway가 처리한다.
openclaw gateway status 로 상태를 확인하고, openclaw gateway restart 로 재시작할 수 있다.
메시지는 어떻게 받나
플랫폼마다 다른 방식으로 메시지를 수신한다.
WhatsApp 은 공식 API가 아니라 WhatsApp Web 프로토콜을 리버스 엔지니어링한 Baileys 라이브러리를 사용한다. QR 코드로 세션을 연결하면 Gateway가 WebSocket 연결을 유지하면서 실시간으로 메시지를 받는다. 폰이 인터넷에 연결되어 있어야 하고, 브라우저에서 WhatsApp Web을 동시에 못 쓸 수 있다.
Telegram 은 Bot API의 long polling 방식이다. @BotFather로 봇을 만들고 토큰을 받으면, Gateway가 주기적으로 새 메시지를 가져온다.
Slack 은 Bolt 라이브러리로 WebSocket 연결을, Discord 는 discord.js로 Gateway WebSocket을 사용한다. iMessage 는 macOS 전용으로 imsg CLI를 통해 로컬 메시지 앱에 접근한다.
Slack 연동하기
Slack에서 OpenClaw를 사용하려면 Slack App을 만들어야 한다.
1. Slack App 생성
Slack API에서 Create New App → From scratch 를 선택한다. App 이름과 워크스페이스를 지정한다.
2. Socket Mode 활성화
Socket Mode 메뉴에서 토글을 켠다. Socket Mode를 사용하면 별도 서버 없이 WebSocket으로 이벤트를 받을 수 있다.
3. App-Level Token 생성
Basic Information → App-Level Tokens → Generate Token and Scopes 를 클릭한다. 토큰 이름을 입력하고 connections:write 스코프를 추가한다. 생성된 App Token (xapp-...)을 복사해둔다.
4. Bot Token 설정
OAuth & Permissions 에서 Bot Token Scopes 에 다음 권한들을 추가한다.
chat:write- 메시지 보내기channels:history- 채널 메시지 읽기groups:history- 비공개 채널 메시지 읽기im:history- DM 메시지 읽기mpim:history- 그룹 DM 메시지 읽기
Install to Workspace 를 클릭해서 앱을 설치하고, Bot User OAuth Token (xoxb-...)을 복사해둔다.
5. Event Subscriptions 설정
Event Subscriptions 에서 토글을 켜고, Subscribe to bot events 에 message.im (DM 메시지)을 추가한다. 채널 메시지도 받으려면 message.channels, message.groups 등을 추가한다.
6. App Home 설정
App Home 에서 Messages Tab 을 활성화한다. 이래야 사용자가 봇에게 DM을 보낼 수 있다.
7. OpenClaw 설정
설정 파일(~/.openclaw/config.json)에 토큰을 추가한다.
{
"channels": {
"slack": {
"enabled": true,
"appToken": "xapp-1-...",
"botToken": "xoxb-..."
}
}
}
환경 변수로도 설정할 수 있다.
export SLACK_APP_TOKEN=xapp-1-...
export SLACK_BOT_TOKEN=xoxb-...
Gateway를 재시작하면 Slack 연동이 완료된다.
openclaw gateway restart
User Token (선택사항)
User Token(xoxp-...)을 추가하면 채널 히스토리, 핀, 리액션 등 더 많은 정보를 읽을 수 있다. OAuth & Permissions 에서 User Token Scopes 를 추가하고 앱을 다시 설치하면 된다.
{
"channels": {
"slack": {
"enabled": true,
"appToken": "xapp-1-...",
"botToken": "xoxb-...",
"userToken": "xoxp-..."
}
}
}
기본적으로 User Token은 읽기 전용으로만 사용된다.
메시지는 누구 이름으로 보내나
이것도 플랫폼마다 다르다.
WhatsApp 은 두 가지 방식이 있다. 전용 번호를 등록해서 OpenClaw 전용으로 쓰면 그 번호로 메시지가 간다. 본인 번호에 연결하면 내가 보낸 것처럼 간다. 전용 번호 방식이 깔끔해서 권장된다.
Telegram 은 @BotFather로 만든 봇 이름으로 메시지가 간다. "MyAssistantBot"으로 만들었으면 그 이름으로 표시된다.
Slack 은 만든 Slack App 이름으로, iMessage 는 본인 계정으로 메시지가 간다.
참고로 기본 정책이 pairing이라서, 모르는 사람이 메시지를 보내면 페어링 코드만 받고 관리자가 승인해야 처리된다. OpenClaw가 내 연락처에 무작위로 메시지 보내는 일은 없다.
iMessage는 SMS도 된다
iMessage의 경우 --service auto 옵션을 쓰면 상대방이 iPhone 사용자면 iMessage로, 아니면 SMS로 보낸다. 다만 SMS를 보내려면 iPhone의 "문자 메시지 전달" 기능을 켜서 Mac과 연동해야 한다. Mac 단독으로는 iMessage만 가능하다.
대화 기억은 파일로 저장
OpenClaw가 대화를 기억하는 건 마법이 아니다. 그냥 마크다운 파일에 저장하는 거다.
~/openclaw/MEMORY.md 에 장기 기억이 들어가고, ~/openclaw/memory/2026-01-28.md 처럼 날짜별 기록도 남는다. "이거 기억해줘"라고 하면 파일에 써두고, 나중에 관련 대화할 때 참조한다. 벡터 인덱스도 만들어서 의미 기반 검색이 된다.
WhatsApp에서 대화하다가 나중에 Telegram에서 이어서 해도 같은 파일 참조하니까 맥락이 유지된다.
터미널 권한은 어떻게 되나
OpenClaw가 터미널 명령을 실행할 때는 Gateway를 실행한 OS 사용자의 권한 그대로 실행된다. root로 Gateway를 띄웠으면 root 권한, 일반 유저로 띄웠으면 그 유저 권한이다.
기본 설정에서는 샌드박싱이 꺼져 있어서 승인 없이 바로 실행된다. 편하긴 한데 위험하다.
권한 설정은 세 가지 축으로 조절할 수 있다. host 는 실행 위치(sandbox, gateway, node)를 정하고, security 는 보안 모드(deny, allowlist, full)를 정하고, ask 는 승인 프롬프트(off, on-miss, always) 여부를 정한다.
특정 명령 실행 전 승인 받기
ask 옵션을 사용하면 OpenClaw가 명령을 실행하기 전에 사용자에게 승인을 요청하도록 설정할 수 있다.
| 값 | 동작 |
|---|---|
off | 승인 없이 바로 실행 (기본값) |
on-miss | allowlist에 없는 명령만 승인 요청 |
always | 모든 명령 실행 전 승인 요청 |
예를 들어 git, npm, curl 같은 안전한 명령은 바로 실행하고, 그 외 명령은 승인을 받고 싶다면:
{
"agents": {
"defaults": {
"security": "allowlist",
"ask": "on-miss"
}
},
"allowedCommands": ["git", "npm", "curl"]
}
모든 명령에 대해 승인을 받고 싶다면 ask: "always" 로 설정하면 된다. 승인 요청은 연결된 메시징 채널(WhatsApp, Telegram 등)로 온다.
실용적인 설정은 명령어 화이트리스트다. 허용할 명령만 명시하고 나머지는 차단하는 방식이다.
{
"allowedCommands": ["git", "npm", "curl"],
"blockedCommands": ["rm -rf", "sudo", "chmod"]
}
security: "allowlist" 모드에서는 ;, &&, || 같은 체이닝이나 리다이렉션도 차단된다. 프롬프트 인젝션으로 명령어를 이어붙이는 공격을 막을 수 있다.
sudo 같은 상위 권한이 필요하면 /elevated on 으로 세션별로 켤 수 있는데, 기본은 꺼져 있다.
보안은 신경 써야 한다
OpenClaw는 기본 설정에서 호스트에 풀 액세스다. 터미널 명령 실행, 파일 읽기/쓰기 전부 가능하다. 이게 핵심 기능이자 동시에 위험 요소다.
실제로 프롬프트 인젝션 공격 사례가 있다. 누군가 OpenClaw가 접근 가능한 이메일 계정에 숨겨진 명령이 담긴 메일을 보냈고, OpenClaw는 그 명령을 따라 모든 이메일을 삭제했다. 휴지통까지. 이론적인 위험이 아니라 실제로 일어난 일이다.
보안 연구자들이 인터넷에 노출된 OpenClaw 게이트웨이를 1,600개 넘게 발견했다는 보고도 있다. 자격 증명이 평문 파일로 저장되니까 설정을 꼭 해야 한다.
첫째, root로 실행하지 말 것. 전용 사용자를 만들어서 쓰는 게 좋다.
adduser openclaw
usermod -aG sudo openclaw
su - openclaw
둘째, 파일 권한 설정.
chmod 700 ~/.openclaw
chmod 600 ~/.openclaw/config.json
openclaw security audit --fix
셋째, 그룹/채널은 샌드박스로. 혼자 쓸 때는 괜찮아도, 다른 사람이 메시지 보낼 수 있는 그룹에서는 Docker 샌드박스 안에서 실행되게 설정해야 한다.
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main"
}
}
}
}
Git 권한 분리는 봇 계정으로
OpenClaw에게 Git 작업을 시키면서도 main 브랜치에 직접 push는 막고 싶다면, 처음엔 Fine-grained Personal Access Token(PAT)만 쓰면 될 거라 생각했다. 하지만 직접 해보니 함정이 있었다.
PAT만으로는 부족한 이유
Fine-grained PAT로 권한을 Contents와 Pull requests만 주고, Branch Protection Rules로 "Require a pull request before merging"과 "Require approvals (1명)"을 설정했다.
이렇게 하면 OpenClaw가 main에 직접 push는 못하니까 안전할 거라 생각했다. 하지만 치명적인 문제가 있었다:
GitHub의 기본 규칙: PR author는 자기 PR을 approve할 수 없다.
OpenClaw가 내 PAT(내 계정)을 사용해서 PR을 만들면, 그 PR의 author는 나다. 그런데 나는 내 PR을 approve할 수 없으니, 아무도 approve를 못해서 PR이 막혀버린다.
Branch protection에서 approval requirement를 없애면? 그럼 OpenClaw가 PAT 권한으로 바로 merge도 할 수 있게 된다. 내가 원하는 건 "PR은 만들되, merge는 내가 확인 후 하는 것"인데, PAT만으로는 이걸 구현할 수 없다.
GitHub App은 어떨까?
GitHub App을 만들어서 fine-grained permissions를 주면 되지 않을까? 이론상 가능하지만 실전에서는 복잡하다.
문제점:
ghCLI가 GitHub App의 private key 인증을 직접 지원하지 않음- Private key로 JWT를 생성하고, 이걸로 installation access token(1시간 유효)을 발급받아야 함
- Token이 1시간마다 만료되므로 갱신 스크립트 필요
- OpenClaw가
ghCLI를 그대로 쓰는 구조라 잘 통합 안 될 가능성
가능은 하지만 귀찮고 복잡하다. 더 간단한 방법이 있다.
봇 계정이 정답이다
가장 깔끔한 해결책은 별도 GitHub 계정을 만드는 것이다.
구조:
계정 A (본인)
- Repository owner
- CODEOWNERS
- PR approve & merge 담당
계정 B (봇, 예: steve-bot)
- Repository collaborator (Write 권한)
- OpenClaw가 사용
- PR만 생성
장점:
- 무료 (GitHub 계정은 무료)
- 간단 (5분이면 설정 완료)
ghCLI 그대로 사용 가능- PR author ≠ 본인이므로 본인이 approve 가능
- 봇 계정은 main에 직접 push 불가능 (repository rule 적용)
설정 방법
1단계: 봇 계정 만들기
새 이메일 주소로 GitHub 계정 생성 (예: steve-bot)
2단계: Repository에 collaborator로 추가
Repository → Settings → Collaborators → Add people → 봇 계정 초대 (Write 권한)
3단계: 봇 계정으로 PAT 생성
봇 계정으로 로그인해서 Fine-grained PAT 생성:
- Repository access: 해당 repo만 선택
- Permissions:
- Contents: Read and write
- Pull requests: Read and write
- Metadata: Read-only
4단계: OpenClaw에 PAT 추가
openclaw configure
{
"env": {
"GH_TOKEN": "github_pat_xxxxx..."
}
}
Gateway 재시작:
openclaw gateway restart
5단계: Branch Protection Rules 설정
Repository → Settings → Rules → Rulesets → New ruleset
- Target branches: main
- Rules:
- ✅ Require a pull request before merging
- ✅ Required approvals: 1
- ✅ Require review from Code Owners (선택사항)
6단계: CODEOWNERS 파일 생성 (선택사항)
.github/CODEOWNERS 파일 생성:
* @본인계정
이렇게 하면 모든 PR에 본인의 리뷰가 필수가 된다.
워크플로우
실제 사용 흐름은 이렇다:
- OpenClaw(봇 계정)에게 "블로그에 XX 글 추가해줘" 요청
- 봇이 브랜치 생성 → 파일 작성 → 커밋 → push
- 봇이
gh pr create로 PR 생성 - 본인이 GitHub에서 PR 확인 & approve & merge
봇은 PR만 만들고, 최종 머지는 본인이 한다. 안전하고 통제 가능하다.
실제 경험담
처음엔 "PAT 권한만 제한하면 되겠지"라고 생각했다. Branch protection rules도 걸어두고, Fine-grained PAT로 세밀하게 권한 제어했다. 그런데 막상 OpenClaw에게 블로그 글 작성을 시키고 나니, 내가 내 PR을 approve할 수 없어서 막혔다.
"GitHub App으로 하면 되지 않을까?" 생각했지만, gh CLI가 App의 private key를 직접 지원하지 않는다는 걸 알았다. Token 갱신 스크립트를 만들어야 하고, OpenClaw와 통합도 복잡하다.
결국 가장 간단한 해결책은 별도 계정 만들기였다. 5분 만에 설정 끝나고, 깔끔하게 권한 분리가 된다. 봇 계정으로 PR 만들면 본인이 approve할 수 있고, repository protection rules도 정상 작동한다.
혼자 쓰는 프로젝트에 계정을 하나 더 만드는 게 과하다고 느껴질 수 있지만, 실제로 해보니 이게 제일 실용적이고 안전했다.
Fine-grained PAT의 숨은 함정
봇 계정을 만들고 나서도 한 가지 문제가 더 있었다.
3단계에서 Fine-grained PAT를 생성했는데, Repository access에서 "Only select repositories"를 선택하면 본인이 소유한 repository만 목록에 나타난다. Collaborator로 초대받은 repository(frontalnh/personal-blog)는 선택 목록에 없었다.
"All repositories" 옵션을 선택하면 접근은 되지만, 보안상 좋지 않다. 봇 계정이 소유한 repository가 없으니 모든 repository를 선택하면 향후 추가될 모든 repository에 접근 권한이 생긴다.
해결책: Classic PAT 사용
결국 Classic Personal Access Token을 사용하기로 했다. Classic PAT는:
- Collaborator로 초대받은 repository에 자동으로 접근 가능
reposcope 하나면 충분 (코드 읽기/쓰기, PR 생성)- Fine-grained보다 권한이 넓지만, 봇 전용 계정이라 괜찮음
토큰 생성:
- https://github.com/settings/tokens (Classic 탭)
- Generate new token (classic)
- Scopes:
repo(Full control of private repositories)read:org(Read org and team membership, optional butghCLI가 더 잘 작동함)workflow(Update GitHub Action workflows, 필요시)
- 생성된 토큰 복사 (ghp_로 시작)
OpenClaw 설정 업데이트:
openclaw gateway config.patch --raw '{"env":{"GH_TOKEN":"ghp_xxxxx..."}}'
Gateway가 자동으로 재시작되고, 이제 gh CLI가 collaborator repository에도 정상 작동한다.
확인:
# 봇 계정으로 인증되었는지 확인
GH_TOKEN="ghp_xxxxx..." gh api user
# Repository 접근 권한 확인
GH_TOKEN="ghp_xxxxx..." gh api repos/frontalnh/personal-blog
permissions에 "push": true가 있으면 성공이다.
실전 팁
gh CLI와 환경 변수:
OpenClaw의 exec 도구로 gh 명령어를 실행할 때, Gateway의 환경 변수가 자동으로 전달되지 않을 수 있다. 이 경우 명령어에 직접 환경 변수를 포함시키면 된다:
GH_TOKEN="ghp_xxxxx..." gh pr create ...
또는 exec의 env 파라미터를 사용한다 (OpenClaw가 지원하는 경우).
Collaborator 초대 수락 잊지 말기:
봇 계정에게 collaborator 초대를 보낸 후, 반드시 봇 계정으로 로그인해서 초대를 수락해야 한다. 수락 전까지는 repository 접근이 불가능하다. GitHub 알림 또는 이메일에서 초대 링크를 찾아 Accept invitation을 클릭한다.
권한 확인:
Repository → Settings → Collaborators에서 봇 계정이 Write 권한으로 표시되는지 확인한다. Read 권한만 있으면 PR을 만들 수 없다.
멀티 에이전트 설정
용도별로 에이전트를 분리하고 싶을 때가 있다. 예를 들어 개인용과 업무용을 나누거나, 프로젝트별로 다른 설정을 쓰고 싶을 때다.
~/.openclaw/openclaw.json에서 여러 에이전트를 정의할 수 있다:
{
"agents": {
"list": [
{
"id": "home",
"workspace": "~/.openclaw/workspace-home"
},
{
"id": "work",
"workspace": "~/.openclaw/workspace-work"
}
]
},
"bindings": [
{ "agentId": "home", "match": { "channel": "whatsapp", "accountId": "personal" } },
{ "agentId": "work", "match": { "channel": "slack" } }
]
}
bindings로 어떤 채널/계정에서 온 메시지를 어떤 에이전트가 처리할지 정한다. WhatsApp 개인 계정은 home 에이전트가, Slack은 work 에이전트가 처리하는 식이다.
CLI로 에이전트를 추가하고 확인할 수 있다:
openclaw agents add work
openclaw agents list --bindings
특정 에이전트와 대화하기
CLI에서는 --agent 플래그로 특정 에이전트를 지정해서 대화할 수 있다:
openclaw agent --agent work --message "오늘 일정 알려줘"
대시보드에서는 멀티 에이전트 설정 후 "Agents" 메뉴가 나타난다. 에이전트가 하나뿐이면 메뉴가 안 보이니, 두 개 이상 설정해야 한다.
가격
OpenClaw 자체는 MIT 라이선스 무료 오픈소스다. 비용은 LLM API 사용료에서 나온다.
가볍게 쓰면 월 $10-30, 많이 쓰면 $70-150 정도 나온다. Claude Max 구독($100/월)이 있으면 setup-token 방식으로 API 비용 없이 쓸 수 있어서, 많이 쓴다면 구독이 더 경제적일 수 있다.
24시간 돌리려면 서버가 필요한데, 본인 PC를 켜두거나 DigitalOcean($6-12/월) 같은 VPS를 쓰면 된다. Raspberry Pi에서 돌리는 사람들도 있다.
Claude 구독으로 쓸 때 주의점
Claude Pro나 Max 구독이 있으면 claude setup-token 으로 토큰을 생성해서 OpenClaw에 쓸 수 있다. 이렇게 하면 별도 API 비용이 안 든다.
걱정되는 건 "토큰 생성하면 기존 컴퓨터에서 Claude Code 못 쓰나?"인데, 둘 다 쓸 수 있다. setup-token은 별도의 long-lived 토큰을 생성하는 거라 기존 Claude Code 세션을 로그아웃시키거나 무효화하지 않는다.
다만 주의할 점이 있다. OAuth refresh token이 일회용이라서 토큰 갱신 시 충돌이 생길 수 있다. Claude Code가 토큰을 갱신하면 OpenClaw가 가지고 있던 기존 refresh token이 무효화되는 식이다. 이 경우 claude setup-token 을 다시 실행해서 새 토큰을 발급받거나, OpenClaw gateway를 재시작하면 된다.
자주 발생하는 문제는 아니지만, 갑자기 OpenClaw 인증이 안 되면 이걸 의심해볼 수 있다.
써볼 만한가
솔직히 설정하고 관리하는 데 손이 좀 간다. 토큰 갱신 문제도 가끔 생기고, 보안 설정도 직접 해야 한다.
그래도 "아침마다 이메일 요약해서 WhatsApp으로 보내줘", "서버 죽으면 바로 알려줘" 같은 자동화가 필요하다면 써볼 만하다. ChatGPT처럼 브라우저 탭에서만 사는 AI가 아니라, 실제로 내 시스템에서 일을 처리해주는 에이전트를 원한다면 현재로선 가장 완성도 높은 오픈소스 옵션이다.