텔레그램으로 코딩 에이전트를 이어 받는 구성의 전제는 메신저가 아니라 서버 프로세스가 살아 있는가다. Hermes Agent의 메시징 게이트웨이는 백그라운드 프로세스 하나가 Telegram, Discord, Slack, WhatsApp, Signal 등을 받고, 세션을 다루며, 크론을 틱한다. OpenClaw도 셀프호스트 멀티채널 게이트웨이다. 공식 허브는 docs.openclaw.ai다. 채널이 살아 있어도 게이트웨이 뒤의 에이전트와 터미널이 죽어 있으면 쓰기를 승인할 근거가 없다.
OpenClaw 텔레그램은 BotFather로 봇을 만들고, 기본 dmPolicy는 pairing이다. 모르는 발신자는 코드가 나오기 전까지 메시지가 처리되지 않는다. 승인은 openclaw pairing approve telegram <CODE>다. 문서 기준 페어링 코드는 1시간 뒤 만료된다. Hermes 쪽도 페어링 코드가 1시간 만료, 속도 제한, 암호학적 난수를 쓴다고 메시징 문서가 적는다. 두 제품의 1시간은 DM 입장 시계다. 저장소 쓰기 승인의 만료는 그와 다른 시계다.
채팅에 API 키나 env 조각, 고객 로그를 넣으면 메신저 백업과 알림 미리보기에 남는다. 집 Wi-Fi와 LTE에서 중단과 재개를 둘 다 보지 않으면, 네트워크가 바뀔 때 콜백과 DNS, 절전 동작을 모른다. 텔레그램은 승인 채널이다. 코드 편집과 시크릿 붙여넣기는 폰의 역할이 아니다. 화이트리스트 없이 공개 그룹에서 명령을 받으면 봇 토큰이 있는 사람과 그룹 멤버가 같은 실행면을 공유한다.
Hermes 기본 전송은 플랫폼마다 다르고, OpenClaw 텔레그램은 롱 폴링이 기본, 웹훅은 선택이다. 집 밖 LTE에서는 DNS와 절전 정책이 달라져 웹훅이 늦게 도착할 수 있다. 집 Wi-Fi에서만 통과한 구성은 밖을 증명하지 못한다.

BotFather
OpenClaw 텔레그램은 두 갈래로 토큰을 만든다. 채팅에서는 핸들이 정확히 @BotFather인지 본 뒤 /newbot을 따른다. 웹에서는 BotFather 웹앱에서 봇을 만들고 토큰을 복사한다. 두 갈래의 끝은 같은 토큰이다. 그 토큰을 설정에 넣고 게이트웨이를 시작한다.
BotFather의 /setprivacy는 그룹 메시지 수신을 가른다. /setjoingroups는 그룹 추가 허용을 가른다. 같은 토글은 웹앱에도 있다. Privacy Mode는 그룹에서 봇이 멘션과 명령 일부만 보게 한다. 모든 그룹 메시지를 보려면 Privacy Mode를 끄거나 봇을 그룹 관리자로 둔다. 토글 뒤에는 그룹에서 봇을 뺐다가 다시 넣어야 적용된다.
토큰이 새면 즉시 폐기와 재발급이 필요하다. 채팅 히스토리와 백업에 토큰이 남았다고 가정하는 편이 안전하다. getMe returned 401은 텔레그램이 설정된 봇 토큰을 거절했다는 뜻이다. BotFather에서 토큰을 다시 복사하거나 재발급한 뒤 botToken, tokenFile, TELEGRAM_BOT_TOKEN을 갱신한다.
설정 예 키는 channels.telegram.enabled, botToken, dmPolicy: pairing, 그룹 requireMention: true다. 환경 변수 폴백 TELEGRAM_BOT_TOKEN은 기본 계정만이다. named account는 botToken 또는 tokenFile을 쓴다.
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
openclaw channels login telegram은 쓰지 않는다. 토큰을 넣은 뒤 openclaw gateway가 프로세스를 띄운다.
BotFather /newbot이 만드는 것은 봇 사용자 이름과 토큰이다. 토큰은 123:abc 형태의 비밀이다. 채팅에 붙여 넣으면 백업과 미리보기에 남는다. 웹앱 흐름도 같은 토큰을 복사한다. /setjoingroups가 그룹 추가를 막으면, 봇을 그룹에 넣는 입구 자체가 닫힌다. /setprivacy가 켜져 있으면 그룹에서 멘션과 명령 일부만 보인다. 관리자 봇은 모든 그룹 메시지를 받으므로 도구 범위와 같이 좁힌다.
Hermes 쪽 봇은 hermes gateway setup 마법사가 플랫폼을 고르고 토큰과 allowlist를 받는다. 환경 변수 TELEGRAM_ALLOWED_USERS는 숫자 ID 목록이다. 마법사와 환경 변수가 같은 입구 층을 다른 경로로 잠근다. 게이트웨이 프로세스가 죽어 있으면 어느 경로로 잠갔든 메시지가 도착하지 않는다.
Hermes pairing 명령
Hermes 공식 메시징 문서는 게이트웨이가 설정된 플랫폼에 연결하고, 세션을 다루고, 크론 작업을 돌리고, 음성 메시지를 전달한다고 적는다. 대화형 설정은 hermes gateway setup이다. hermes gateway status는 그 프로세스가 살아 있는지를 본다. 게이트웨이가 서버에서 죽어 있으면 페어링이 되어 있어도 메시지가 쌓이지 않거나 늦게 도착한다.
기본 보안은 allowlist나 DM 페어링에 없는 사용자를 거부한다. 환경 변수 예는 TELEGRAM_ALLOWED_USERS에 숫자 ID를 넣는 형태다. 대안이 DM 페어링이고, 승인 예는 아래와 같다.
hermes gateway setup
hermes pairing approve telegram XKGH5N7P
hermes gateway setup은 플랫폼과 allowlist를 대화형으로 받는다. hermes pairing approve는 코드에 적힌 발신자에게 DM 접근을 연다. 코드 만료는 문서상 1시간이다. 속도 제한과 암호학적 난수가 같이 적혀 있다. XKGH5N7P는 문서 예시 코드다. 실제 코드는 그때마다 난수로 나온다. 채팅에 코드만 남기고 서버 콘솔에서 승인하는 흐름이, 폰에 토큰 파일을 두지 않는 이유와 같다.
크론 틱은 게이트웨이 안에서 60초마다 만기 작업을 실행한다. 원격 승인 채널에서 크론이 쓰기를 열면, 폰 알림이 뭉친 밤에 저장소가 바뀔 수 있다. 크론과 페어링은 같은 프로세스에 있어도 시계가 다르다. 페어링 1시간은 DM 입장이고, 크론 60초는 스케줄 해상도다. 쓰기 승인 만료는 운영자가 서버에서 거절하게 두는 세 번째 시계다.
Hermes 메시징 안의 슬래시 명령은 원격 승인 채널에서 범위가 크다. /status는 세션 정보, /stop은 하드 스톱, /approve와 /deny는 위험한 명령의 허가와 거절이다. /new 또는 /reset은 대화를 새로 시작한다. 그룹에서 에이전트가 대답할 필요가 없으면 침묵 토큰([SILENT], SILENT, NO_REPLY)이 최종 응답 전체일 때 전송을 억제한다. 실패 턴은 침묵으로 숨기지 않는 편이 관측에 유리하다. 바쁜 에이전트에 메시지를 보내면 기본은 현재 턴을 리다이렉트한다.
크론 틱은 게이트웨이 안에서 60초마다 만기 작업을 실행한다. 크론 60초와 페어링 1시간은 같은 시계가 아니다.
OpenClaw pairing 명령
OpenClaw 기본 DM 정책은 pairing이다. 봇에 처음 메시지를 보내면 페어링 코드가 나온다. 코드는 8자 대문자이고, 혼동 문자(0O1I)를 빼며, 채널 계정당 대기 요청은 3개로 막힌다. 추가 요청은 하나가 만료되거나 승인될 때까지 무시된다. 봇은 발신자당 대략 한 시간에 한 번 페어링 메시지를 보낸다.
서버 콘솔의 기동과 승인 예는 아래와 같다.
openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
openclaw gateway는 채널 플러그인을 받는 프로세스를 띄운다. pairing list는 대기 중인 코드를 보여 준다. pairing approve는 그 발신자에게 DM 접근을 연다. 첫 승인에서 아직 command owner가 없으면 commands.ownerAllowFrom을 그 발신자로 부트스트랩한다. 이후 승인은 DM 접근만 주고 owner를 넓히지 않는다. 그룹 권한은 별도 allowlist다.
핵심 포인트: pairing 승인은 「이 사람이 모든 곳에서 관리자」가 아니다. OpenClaw 문서는 DM 접근과 그룹 allowlist, owner 부트스트랩을 따로 적는다.
dmPolicy: open에 allowFrom: ['*']를 넣으면 봇 사용자 이름을 아는 모든 텔레그램 계정이 명령을 보낸다. allowlist인데 allowFrom이 비면 모든 DM이 거부되고 설정 검증이 거절한다. 예전 @username 항목은 openclaw doctor --fix가 숫자 ID로 바꾸려 시도한다.
| 항목 | Hermes | OpenClaw |
|---|---|---|
| 공식 문서 | hermes-agent.nousresearch.com/docs | docs.openclaw.ai |
| 게이트웨이 | 백그라운드 프로세스 하나, 크론 60초 틱 | 멀티채널 Gateway 한 프로세스 |
| 텔레그램 봇 | 게이트웨이 설정 마법사 | BotFather /newbot 또는 웹앱 |
| DM 기본 | allowlist 또는 DM 페어링 | dmPolicy: pairing |
| 승인 명령 | hermes pairing approve telegram <CODE> | openclaw pairing approve telegram <CODE> |
| 코드 만료 | 문서상 1시간 | 문서상 1시간 |
폰 vs 서버
폰과 텔레그램에 남는 일과 서버에만 남는 일은 역할이 다르다. 상태 확인, 승인·거절, 짧은 알림, 화이트리스트된 명령, 페어링 코드 전달은 폰 쪽에 가깝다. 시크릿, 긴 패치, 배포, 로그 원문, DB 덤프, 임의 셸, 프로덕션 쓰기, 토큰 파일과 .env는 서버만의 일이다.
| 폰 / 텔레그램 | 서버만 |
|---|---|
| 상태 확인, 승인·거절 | 시크릿, 긴 패치, 배포 |
| 짧은 알림 | 로그 원문, DB 덤프 |
| 화이트리스트된 명령 | 임의 셸, 프로덕션 쓰기 |
| 페어링 코드 전달 | 토큰 파일, .env |
텔레그램 승인 메시지에는 저장소 이름, 변경 요약 한 줄, 위험도(읽기/쓰기), 만료 시각만 넣는 템플릿이 미리보기 사고면을 줄인다. 긴 로그를 붙이면 미리보기와 백업에 남는다. 자세한 내용은 서버 콘솔 링크나 티켓 번호로 대체된다. 잠금 화면 미리보기에 경로가 남을 수 있으므로 공용 와이파이에서 승인할 때도 템플릿이 짧은 편이 안전하다.

원격으로 서버 상태를 물을 때는 프로세스 PID, 마지막 성공 시각, 디스크 여유, 오늘 비용만 답하게 도구 권한을 제한하는 구성이 사고면을 줄인다. 상태 질문에 파일 내용이나 시크릿이 포함되면, 승인 채널이 로그 원문의 두 번째 저장소가 된다.
가족이 같은 Wi-Fi를 쓰거나 공용 계정 알림이 켜져 있으면, 봇이 있는 그룹 멤버십을 분기마다 보는 점검이 입구를 유지한다. 퇴사자·외부 협업자가 남아 있는 그룹에서 승인 명령을 받는 구성은 사고가 난다. 화이트리스트 ID와 그룹 멤버 목록이 같은 점검에 있으면, 숫자 ID만 잠그고 그룹은 열린 상태를 놓치지 않는다.
토큰 파일과 .env가 폰에 있으면 분실 시 실행 층과 입구가 같이 나간다. 긴 패치를 텔레그램만으로 끝내는 구성은 백업과 미리보기 때문에 맞지 않는다. 시크릿 입력은 서버 콘솔이나 VPN이 맞다.
OpenClaw Control UI 기본은 127.0.0.1:18789 루프백이다. 원격 대시보드는 Tailscale serve/funnel 같은 별 경로다. Mini App /dashboard는 HTTPS 공개 URL과 숫자 사용자 ID owner 검사가 필요하고, 그룹이 아니라 DM에서만 버튼이 나온다. 와일드카드와 사용자 이름은 Mini App owner를 주지 않는다.
토큰 파일
OpenClaw는 tokenFile이 botToken보다, 설정이 env보다 앞선다. tokenFile은 일반 파일이어야 하고, 심볼릭 링크는 거절된다. 기동 후 봇 identity를 최대 24시간 캐시하므로, 토큰을 바꾸거나 지우면 그 캐시도 비운다. 캐시를 비우지 않으면 폐기한 토큰과 새 토큰이 한동안 섞여 보인다.
토큰이 새면 폐기와 재발급, 화이트리스트와 웹훅 또는 폴링 재잠금이 사고면을 줄인다. 그룹에 봇을 넣었다면 관리자만 명령 가능하게 제한하는 쪽이 사고 면적이 작다. OWASP Secrets Management 치트시트가 출처에 있는 이유다.
Hermes 쪽 비밀값은 ~/.hermes/.env, 일반 설정은 ~/.hermes/config.yaml이다. 텔레그램 allowlist는 TELEGRAM_ALLOWED_USERS 같은 환경 변수로 숫자 ID를 받는 형태가 문서 예다. 채팅에 키를 붙이면 파일 분리가 무의미해진다.
continue
쓰기 권한이 열린 상태의 continue는 비용과 변경을 같이 키운다. 야간과 원격에서는 기본이 읽기인 구성이 사고면을 줄인다. continue 전에 허용 경로를 다시 읽는 이유가 승인 버튼만 보고 범위를 추정하지 않기 위해서다.
Hermes 메시징은 /approve, /deny로 위험한 명령을 처리하고, /stop은 하드 스톱이다. 절전 모드의 폰은 알림을 뭉친다. 업무 시간 밖 continue를 금지하는 규칙이 있다면, 폰 알림 설정과 서버 권한 설정이 같은 방향을 보도록 맞추는 편이 의미가 있다. 폰만 막고 서버 쓰기가 열려 있으면 규칙이 한쪽만 잠긴 상태다.
알림은 실패, 예산, 쓰기 시도만 남기는 편이 관측에 유리하다. 성공 스팸이 많으면 진짜 장애를 놓친다. 봇이 응답하는 명령 집합을 화이트리스트로 문서화하면, 문서에 없는 명령이 동작할 때 권한 drift를 가릴 수 있다. 주 1회 명령 목록과 실제 핸들러를 대조하는 점검이 drift를 늦게 발견하지 않게 한다.
승인 요청에 만료 시각이 없으면, 어제 알림을 오늘 눌러 쓰는 사고가 난다. 만료된 승인은 서버에서 거절되게 두고, 메신저에도 만료 안내가 남는 구성이 재현 가능한 거절이다. OpenClaw 페어링 코드 1시간과, 운영자가 정한 쓰기 승인 만료는 다른 시계다. 전자는 DM 입장, 후자는 저장소 변경이다.

페어링이 유효해도 쓰기 승인이 만료된 상태와, 쓰기 승인이 유효해도 게이트웨이가 죽은 상태는 증상이 비슷해 보일 수 있다. 로그 최소 필드에 시각과 실행 주체, 중단 사유가 있으면 두 시계를 가린다.
Hermes /approve와 /deny는 위험한 명령의 허가와 거절이다. /stop은 하드 스톱이다. 절전 모드의 폰은 알림을 뭉친다. 업무 시간 밖 continue를 막는 규칙이 서버 쓰기 권한과 같은 방향을 보지 않으면, 폰만 잠기고 서버 쓰기는 열린 상태가 된다. 승인 요청에 만료 시각이 없으면 어제 알림을 오늘 눌러 쓰는 사고가 난다. 만료된 승인은 서버에서 거절되게 두고, 메신저에도 만료 안내가 남는 구성이 재현 가능한 거절이다.
OpenClaw 페어링 코드 1시간과 운영자가 정한 쓰기 승인 만료는 다른 시계다. 전자는 DM 입장이고 후자는 저장소 변경이다. continue 한 줄이 그 두 시계 중 어느 쪽에 속하는지 승인 메시지 칸에 없으면, 버튼만 보고 범위를 추정하게 된다. 허용 경로를 continue 전에 다시 읽는 이유가 그것이다. 상태 질문의 답 칸을 PID, 마지막 성공 시각, 디스크 여유, 오늘 비용으로 제한하면 파일 원문과 시크릿이 채팅에 안 붙는다. 봇이 응답하는 명령 집합을 화이트리스트로 적어 두면, 문서에 없는 명령이 동작할 때 권한 drift를 가린다. /status의 답에 파일 원문이 붙으면 승인 채널이 로그의 두 번째 저장소가 된다. 허용 답 칸은 PID, 마지막 성공 시각, 디스크 여유, 오늘 비용이다. 그 밖의 내용은 서버 콘솔 링크나 티켓 번호로 대체된다. 잠금 화면 미리보기에 경로가 남을 수 있으므로 승인 템플릿은 저장소 이름, 한 줄 요약, 위험도, 만료 시각 네 칸으로 두는 편이 사고면을 줄인다. 긴 로그를 붙이면 백업에 남는다. 공용 와이파이에서 승인할 때도 템플릿이 짧은 편이 미리보기 사고면을 줄인다. 가족 공유 알림이 켜져 있으면 미리보기 칸이 집 안 다른 화면에도 남는다.
그룹 Privacy Mode
텔레그램 봇 기본 Privacy Mode는 그룹 메시지 수신을 제한한다. Privacy Mode를 끄지 않으면 봇은 멘션과 명령 일부만 본다. 모든 그룹 메시지를 보려면 /setprivacy로 끄거나 봇을 그룹 관리자로 둔다. 토글 뒤에는 그룹에서 봇을 뺐다가 다시 넣어야 적용된다.
그룹에 봇을 넣은 뒤 필요한 값은 자신의 텔레그램 사용자 ID(allowFrom / groupAllowFrom)와 그룹 채팅 ID(channels.telegram.groups 키)다. 슈퍼그룹 ID는 -100으로 시작하는 음수다. 그 값은 groupAllowFrom이 아니라 groups 아래 키로 간다. OpenClaw 그룹은 기본으로 멘션이 필요하다. 봇 핸들 @my_bot이 에이전트 페르소나 이름과 달라도, 그 핸들 멘션은 선택된 에이전트를 가리킨다.
관리자 봇은 모든 그룹 메시지를 받으므로, 그 권한과 도구 범위를 같이 좁히는 구성이 사고면을 줄인다. groupAllowFrom이 비면 텔레그램은 allowFrom으로 떨어진다. 페어링 저장소로는 떨어지지 않는다. 문서가 보안 경계로 적은 시점 표기는 2026.2.25다.
/whoami@<bot_username>은 사용자와 그룹 ID를 확인하는 경로다. 그룹 채팅 ID는 openclaw logs --follow나 Bot API getUpdates에서도 나온다.
LTE
집 Wi-Fi에서만 통과한 구성은 밖을 증명하지 못한다. 폰을 LTE/5G로 바꿔 중단과 재개를 다시 보는 항목이 네트워크 계층의 대조다. 집 밖에서는 DNS와 절전 정책이 달라져 웹훅이 늦게 도착할 수 있다. OpenClaw 텔레그램 기본 전송은 롱 폴링이고 웹훅은 선택이다. 웹훅을 쓰는 구성은 공개 URL과 네트워크 경로가 추가로 생긴다.
절전 모드의 폰은 알림을 뭉친다. 서버 게이트웨이가 죽어 있으면 페어링이 되어 있어도 메시지가 쌓이지 않거나 늦게 도착한다. 봇이 대답해도 게이트웨이 뒤의 에이전트와 터미널이 죽어 있으면 쓰기 승인의 근거가 없다.
채널에 붙이기 전에 서버 콘솔에서 같은 작업을 중단할 수 있는지가 앞선다. 채널만 살고 서버가 죽으면 원격은 장식이다. 온콜이 없으면 밤에 끊을 사람이 없다.
원격 세션의 만료를 정하지 않으면 어제 알림을 오늘 누르는 사고가 다시 난다. 저장소 쓰기 승인은 pairing 1시간보다 짧은 만료를 서버가 거절하게 두는 편이 안전하다. 편의보다 재현 가능한 거절이 원격의 이점을 지킨다.
슬래시 명령과 침묵 토큰
Hermes 메시징의 /status는 세션 정보를 돌려준다. 상태 질문의 답 칸을 PID, 마지막 성공 시각, 디스크 여유, 오늘 비용으로 제한하면 파일 원문과 시크릿이 채팅에 안 붙는다. /stop은 하드 스톱이다. 에이전트가 엉뚱한 길로 가고 있으면 새 메시지를 넣는 쪽이 현재 턴을 리다이렉트한다. /approve와 /deny는 위험한 명령의 허가와 거절이다. /new와 /reset은 대화를 새로 시작한다.
그룹에서 에이전트가 대답할 필요가 없으면 침묵 토큰이 최종 응답 전체일 때 전송을 억제한다. 값은 [SILENT], SILENT, NO_REPLY다. 실패 턴을 침묵으로 숨기면 관측이 죽는다. 성공 스팸이 많으면 진짜 장애를 놓친다. 알림은 실패, 예산, 쓰기 시도만 남기는 편이 관측에 유리하다.
봇이 응답하는 명령 집합을 화이트리스트로 문서화하면, 문서에 없는 명령이 동작할 때 권한 drift를 가릴 수 있다. 주 1회 명령 목록과 실제 핸들러를 대조하는 점검이 drift를 늦게 발견하지 않게 한다.
OpenClaw Mini App /dashboard는 DM에서만 버튼이 나온다. HTTPS URL과 숫자 사용자 ID owner 검사가 필요하다. 와일드카드와 사용자 이름은 owner를 주지 않는다. Control UI 루프백 127.0.0.1:18789는 그 컴퓨터 안에서만 통한다. 원격 대시보드는 Tailscale serve 또는 funnel이다.
웹훅과 폴링, LTE 지연
OpenClaw 텔레그램 기본 전송은 롱 폴링이다. 게이트웨이가 텔레그램 서버에 업데이트를 묻고, 메시지가 오면 에이전트에 넘긴다. 웹훅은 공개 URL이 생긴다. 집 밖 LTE에서는 DNS와 절전 정책이 달라져 웹훅이 늦게 도착할 수 있다. 집 Wi-Fi에서만 통과한 구성은 밖을 증명하지 못한다.
절전 모드의 폰은 알림을 뭉친다. 업무 시간 밖 continue를 금지하는 규칙이 있다면, 폰 알림 설정과 서버 권한 설정이 같은 방향이어야 한다. 폰만 막고 서버 쓰기가 열려 있으면 규칙이 한쪽만 잠긴 상태다.
getMe returned 401은 텔레그램이 봇 토큰을 거절한 상태다. BotFather에서 토큰을 다시 복사하거나 재발급한 뒤 botToken, tokenFile, TELEGRAM_BOT_TOKEN을 갱신한다. 기동 후 identity 캐시 최대 24시간을 비우지 않으면 옛 신원이 남을 수 있다.
Hermes 게이트웨이가 서버에서 죽어 있으면 페어링이 되어 있어도 메시지가 쌓이지 않거나 늦게 도착한다. 채널에 붙이기 전에 서버 콘솔에서 같은 작업을 중단할 수 있는지가 앞선다. hermes gateway status와 openclaw gateway가 그 전제의 명령이다.
allowFrom은 숫자 ID다. telegram:과 tg: 접두는 정규화된다. 그룹 발신자 인증은 페어링 저장소를 상속하지 않는다. 한 사람 봇의 실무 패턴은 사용자 ID를 allowFrom에 두고 groupAllowFrom은 비우며, 대상 그룹만 groups 아래에 허용하는 쪽이다.
페어링 코드가 8자 대문자인 이유는 사람이 채팅에서 읽고 서버에 치기 위해서다. 0O1I를 빼는 것은 혼동을 줄이려는 설계다. 계정당 대기 3개는 봇을 아는 여러 계정이 동시에 코드를 받아 쌓이는 일을 막는다. 발신자당 대략 한 시간에 한 번 페어링 메시지가 나가는 속도 제한은, 거절된 사람이 코드를 반복해서 받게 하지 않으려는 쪽이다. 1시간 만료는 DM 입장 시계이지 저장소 쓰기 승인 시계가 아니다.
Hermes 쪽 페어링도 1시간 만료와 속도 제한, 암호학적 난수를 쓴다고 메시징 문서가 적는다. 승인 명령의 형태만 hermes pairing approve telegram XKGH5N7P로 다를 뿐, 입구의 층은 같다. allowlist에 없는 사용자는 코드 없이 거부된다. TELEGRAM_ALLOWED_USERS에 숫자 ID를 넣는 형태가 그 잠금의 환경 변수 예다.
토큰 파일과 .env가 폰에 있으면 분실 시 입구와 실행이 같이 나간다. OpenClaw tokenFile이 botToken보다 앞서는 이유는 파일 권한으로 토큰을 분리하기 위해서다. 설정이 env보다 앞서는 이유는 named account가 TELEGRAM_BOT_TOKEN 하나에 묶이지 않게 하려는 쪽이다. 기본 계정만 env 폴백을 쓴다.
getMe 401과 identity 캐시
getMe returned 401은 Telegram Bot API가 설정된 토큰을 거절한 상태다. BotFather에서 토큰을 다시 복사하거나 재발급한 뒤 botToken, tokenFile, TELEGRAM_BOT_TOKEN을 갱신한다. OpenClaw는 폴링을 시작하기 전에 이 응답에서 멈춘다. 웹훅 엔드포인트 정리 실패로 보이지 않는다.
기동 후 봇 identity 캐시는 최대 24시간이다. 캐시가 남아 있으면 getMe를 건너뛴다. 폐기한 토큰과 새 토큰이 한동안 섞여 보이면 그 캐시를 비운 상태인지가 먼저다. tokenFile은 일반 파일이어야 하고 심볼릭 링크는 거절된다. 링크 대상이 바뀌어도 설정 문자열이 같아 보여서, 어떤 비밀이 로드됐는지 로그로 가르기 어렵기 때문이다.
웹훅은 텔레그램이 지정한 HTTPS URL로 업데이트를 밀어 넣는다. 공개 URL과 인증서, 네트워크 경로가 생긴다. 기본 롱 폴링은 게이트웨이가 Telegram 서버에 업데이트를 묻는 방식이라 공개 URL이 없다. 집 밖 LTE에서 DNS와 절전이 달라지면 웹훅이 늦게 도착할 수 있다. 전송 방식은 pairing을 대체하지 않는다. 웹훅이 켜져 있어도 미승인 DM은 pairing이 막는다.
Hermes 비밀은 ~/.hermes/.env에 두고 일반 설정은 ~/.hermes/config.yaml에 둔다. 채팅에 키를 붙이면 파일 분리가 무의미해진다. 토큰이 새면 폐기와 재발급, 화이트리스트와 웹훅 또는 폴링 재잠금이 같은 변경에 들어간다. Control UI 기본은 127.0.0.1:18789 루프백이다. 원격 대시보드는 Tailscale serve 또는 funnel이다. Mini App /dashboard는 HTTPS 공개 URL과 숫자 사용자 ID owner 검사가 필요하고, 그룹이 아니라 DM에서만 버튼이 나온다.
allowFrom 숫자 ID
allowFrom과 groupAllowFrom은 숫자 텔레그램 사용자 ID다. telegram:과 tg: 접두는 정규화된다. @username은 예전 항목이고, openclaw doctor --fix가 숫자 ID로 바꾸려 시도한다. allowlist인데 allowFrom이 비면 모든 DM이 거부되고 설정 검증이 거절한다. dmPolicy: open에 allowFrom: ['*']를 넣으면 봇 사용자 이름을 아는 모든 계정이 명령을 보낸다.
그룹 채팅 ID는 channels.telegram.groups 아래 키다. 슈퍼그룹 ID는 -100으로 시작하는 음수다. 그 값은 groupAllowFrom이 아니라 groups 키로 간다. groupAllowFrom이 비면 텔레그램은 allowFrom으로 떨어진다. 페어링 저장소로는 떨어지지 않는다. 문서가 보안 경계로 적은 시점 표기는 2026.2.25다.
한 사람 봇의 실무 패턴은 사용자 ID를 allowFrom에 두고 groupAllowFrom은 비우며, 대상 그룹만 groups 아래에 허용하는 쪽이다. 다중 계정에서 상위 channels.telegram.allowFrom이 좁으면, 계정 단위 allowFrom: ["*"]만으로 공개 봇이 되지 않는다. 합쳐진 유효 allowlist에 와일드카드가 명시되어 있어야 한다. 계정이 둘 이상이면 channels.telegram.defaultAccount를 두는 편이 라우팅을 분명하게 한다. 생략하면 첫 정규화 계정 ID로 떨어지고 openclaw doctor가 경고한다.
/whoami@<bot_username>은 사용자와 그룹 ID를 돌려주는 경로다. 그룹 채팅 ID는 openclaw logs --follow나 Bot API getUpdates에서도 나온다. Mini App owner는 숫자 ID만 받는다. 와일드카드와 사용자 이름은 owner를 주지 않는다. 첫 페어링 승인에서 아직 command owner가 없으면 commands.ownerAllowFrom을 그 발신자로 부트스트랩한다. 이후 승인은 DM 접근만 주고 owner를 넓히지 않는다. 그룹 권한은 별도 allowlist다.
Privacy Mode를 끄지 않으면 봇은 멘션과 명령 일부만 본다. /setprivacy로 끄거나 봇을 그룹 관리자로 두면 모든 그룹 메시지를 받는다. 토글 뒤에는 그룹에서 봇을 뺐다가 다시 넣어야 적용된다. /setjoingroups가 그룹 추가를 막으면 봇을 그룹에 넣는 입구 자체가 닫힌다. 관리자 봇은 도구 범위와 같이 좁힌다.
마무리
앞에서 다룬 텔레그램 원격 에이전트의 핵심만 짧게 정리한다.
- 원격의 전제는 봇 응답이 아니라 서버 게이트웨이 프로세스다.
- BotFather
/newbot이 봇 신원을 만들고, Hermes는hermes pairing approve, OpenClaw는openclaw pairing approve가 DM 입구를 연다. - OpenClaw 텔레그램 기본은 pairing이고, 코드는 문서 기준 1시간 만료다.
- 폰은 상태와 승인, 시크릿과 긴 패치와 토큰 파일은 서버에 둔다.
- continue는 쓰기 권한이 열린 상태에서 비용과 변경을 같이 키운다.
- Privacy Mode와
-100그룹 ID는 입구의 세부 설정이다. - 집 Wi-Fi 통과만으로는 외부 경로가 증명되지 않는다.
「텔레그램은 편집기가 아니라 승인 채널이다」 pairing 승인과 owner 권한, 그룹 allowlist는 같은 스위치가 아니다. 만료된 승인은 서버가 거절하는 쪽이 메신저 편의보다 안전하다.
출처와 링크
- Hermes messaging: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/
- Hermes Agent docs: https://hermes-agent.nousresearch.com/docs/
- OpenClaw docs: https://docs.openclaw.ai/
- OpenClaw Telegram: https://docs.openclaw.ai/channels/telegram
- OpenClaw pairing: https://docs.openclaw.ai/channels/pairing
- Telegram Bot API: https://core.telegram.org/bots/api
- OWASP Secrets Management: https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html
조사 기준: 2026년 8월. 토큰 회전과 화이트리스트, dmPolicy 기본값은 적용 직전 공식 문서가 기준이다.