Slack 봇 토큰: 찾는 곳과 xoxb, xoxp 차이 테스트
Slack 봇 토큰은 앱의 OAuth & Permissions 페이지에 있는 Bot User OAuth Token으로, xoxb-로 시작하고 앱을 설치하면 나타납니다. 받는 순서, SLACK_BOT_TOKEN으로 읽는 법, xoxp 사용자 토큰, xapp 앱 수준 토큰, xoxe 순환, xoxc 세션 토큰과의 차이를 정리했습니다.
On this page
Slack 봇 토큰은 앱의 OAuth & Permissions 페이지에 있는 Bot User OAuth Token입니다. xoxb-로 시작하고, 앱 자신의 봇 사용자로 동작하며, 앱을 워크스페이스에 설치한 뒤에만 나타납니다. 받으려면 api.slack.com/apps에서 앱을 만들고, OAuth & Permissions에서 chat:write 같은 Bot Token Scopes를 추가한 뒤, Install to Slack을 눌러 허용하고 OAuth Tokens 상자에서 토큰을 복사합니다. 대부분의 코드는 SLACK_BOT_TOKEN이라는 환경 변수에서 이 값을 읽습니다.
사용자 토큰은 xoxp-로 시작하고, 앱을 허용한 사람으로 동작합니다. Slack 문서는 대부분의 앱에 봇 토큰을 권합니다. 설치한 사람의 계정이 비활성화되어도 계속 작동하기 때문입니다. 같은 앱을 파일로 설정하려면 앱 매니페스트 예시를, localhost에서 직접 만든 OAuth 흐름으로 설치하려면 localhost에서의 Slack OAuth 리디렉션 URL을 보세요.
사용자만 할 수 있는 일도 있습니다. 예를 들어 봇에게는 자기 활동 상태가 따로 있어서 내 활동 상태를 바꿀 수 없습니다. 내 Slack 점을 초록으로 유지하는 도구, 예를 들어 Slack Green이 봇 토큰 대신 로그인한 세션을 쓰는 이유가 이것이고, 그 차이는 Slack xoxc와 xoxd 토큰에서 다룹니다.
2026년 10월 3일 저희 워크스페이스에 테스트 앱을 만들어 설치하고, 두 토큰을 받아 실행해 본 뒤 앱을 지웠습니다. 아래의 스크린샷과 출력은 그때 얻은 것입니다.
Slack 봇 토큰 받는 방법
api.slack.com/apps에 가서 Create New App, From scratch를 차례로 누르고, 이름을 정한 뒤 워크스페이스를 고릅니다.- OAuth & Permissions를 열고 Bot Token Scopes를 추가합니다. 예를 들어 글을 올리려면
chat:write, 사람과 활동 상태를 읽으려면users:read입니다. - Install to Slack(예전 페이지에서는 Install to Workspace)을 누르고 Allow를 누릅니다. 새 앱에 관리자 승인이 필요한 워크스페이스도 있습니다.
- 같은 페이지의 OAuth Tokens 상자에서 Bot User OAuth Token(
xoxb-...)을 복사해 비밀로 보관하세요. 코드나 공개 저장소에는 절대 넣지 마세요. 그래도 저장소에 들어갔다면 토큰을 폐기하고 다시 설치하세요. 다시 설치만 하면 같은 토큰이 돌아옵니다. - 봇이 글을 올려야 하는 채널에 봇을 초대합니다:
/invite @your-bot. 초대하지 않으면 공개 채널에서는 not_in_channel, 비공개 채널에서는 channel_not_found로 글쓰기가 실패합니다.
api.slack.com/apps 링크는 이제 app.slack.com/app-settings/<워크스페이스 ID>/<앱 ID>/oauth 설정을 엽니다. 토큰은 Copy 버튼이 붙은 일반 텍스트 칸에 있고 보기 버튼을 누르는 단계도 없어서, 화면을 볼 수 있는 사람은 누구나 읽을 수 있습니다. 이 캡처에서는 저희 토큰을 가렸습니다.
이 페이지는 열 때마다 같은 토큰을 보여 주므로, 잃어버린 토큰은 여기서 다시 가져오면 됩니다. 저희 테스트에서는 범위를 바꾸지 않고 Reinstall to Slack을 눌러도 같은 두 토큰이 돌아왔습니다.
나중에 범위를 추가하면 토큰이 그 범위를 갖도록 앱을 다시 설치하세요. 그 전까지 새 범위가 필요한 호출은 missing_scope로 실패합니다. 토큰 문자열 자체는 바뀌지 않습니다.
시험해 보기:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" https://slack.com/api/auth.test
봇 토큰은 bot_id를 돌려주고, 사용자 토큰은 돌려주지 않습니다. 어느 쪽을 붙여 넣었는지 가장 빨리 알아보는 방법입니다.
xoxb- 토큰을 처음 쓰는 흔한 예는 CI 알림입니다. 빌드에서 글을 올리는 워크플로 YAML은 스레드와 메시지 수정까지 포함해 GitHub Actions에서 Slack 메시지 보내는 법에 있습니다. Python 스크립트라면 토큰을 slack_sdk의 WebClient에 넣습니다. 스레드 답글과 실수마다 돌아오는 오류까지 시험한 스크립트는 Python으로 Slack 메시지 보내기에 있습니다.
실제 xoxb와 xoxp 토큰의 생김새
테스트 앱의 두 토큰은 첫 숫자가 모두 11256386461409였고, 이것은 앱 클라이언트 ID의 앞부분과도 같았습니다. 워크스페이스의 숫자 ID입니다. 나머지 형태는 달랐습니다.
| 봇 토큰 | 사용자 토큰 | |
|---|---|---|
| 접두사 | xoxb- | xoxp- |
| 접두사 뒤의 부분 | 3개: 14자리 숫자 2개, 그다음 영문과 숫자 24자 | 4개: 14자리 숫자 3개, 그다음 16진수 32자 |
| 전체 길이 | 59자 | 82자 |
auth.test의 user | 봇 사용자 sgtokencheck(U0C798V2M88) | Allow를 누른 사람 sieun |
auth.test의 bot_id | B0C68LU08NP | 없음 |
대부분의 코드가 쓰는 환경 변수 SLACK_BOT_TOKEN에서 토큰을 읽는 Python slack_sdk 예시입니다.
import os
from slack_sdk import WebClient
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])
print(client.auth_test().data)
아래 호출은 두 토큰과 망가진 토큰 두 개로 실제 API에 대고 실행했습니다.
| 호출 | 토큰 | 결과 |
|---|---|---|
auth.test | xoxb | ok, bot_id 있음 |
auth.test | xoxp | ok, bot_id 없음 |
search.messages | xoxb | not_allowed_token_type |
search.messages | search:read가 없는 xoxp | missing_scope |
사람에 대한 users.info | 둘 다 | ok |
auth.test | xoxb-123(지어낸 것) | invalid_auth |
auth.test | 토큰 없음 | not_authed |
앱을 지운 뒤 auth.test | xoxb | account_inactive |
앱을 지운 뒤 auth.test | xoxp | token_revoked |
즉 not_allowed_token_type은 그 메서드가 이 종류의 토큰을 아예 받지 않는다는 뜻입니다. 어떤 범위로도 고쳐지지 않고, 사용자 토큰이 필요합니다. missing_scope는 토큰 종류는 맞지만 앱에 그 범위가 주어지지 않았다는 뜻입니다.
코드에 새어 나간 Slack 토큰 찾기
xoxp-를 config.json, config.ini, settings.py, config.yml과 함께 검색하는 사람이 있는 것은 토큰이 바로 그런 곳에 들어가기 때문입니다. 푸시하기 전에 내 저장소를 확인하려면, 다음 패턴이 저희 테스트 파일에서 위의 모든 토큰 형태와 맞았고 그 밖의 것과는 맞지 않았습니다.
grep -rEnI "(xox[abpe]|xapp)[.-][0-9A-Za-z.-]{10,}" .
살아 있는 토큰이 나오면 그 줄만 지우지 말고 토큰을 폐기하세요. 토큰은 git 기록에 남아 있습니다.
Slack 토큰 종류와 접두사
| 접두사 | 토큰 | 누구로 동작하나 |
|---|---|---|
xoxb- | 봇 토큰 | 앱의 봇 사용자 |
xoxp- | 사용자 토큰 | 앱을 허용한 사용자 |
xapp- | 앱 수준 토큰 | 모든 설치에 걸친 앱 |
xoxe.xoxb-, xoxe.xoxp- | 순환되는 액세스 토큰 | 봇 또는 사용자, 12시간 뒤 만료 |
xoxe- | 새로 고침 토큰 | 새 액세스 토큰을 받을 때 사용 |
xwfp- | 워크플로 토큰 | 워크플로 단계, 최대 15분 |
xoxc-, xoxd- | 웹 클라이언트 세션 | Slack 웹 앱으로서의 나 |
Slack 문서에는 App Manifest API용 구성 토큰과 Deno Slack SDK로 만든 앱용 서비스 토큰도 나와 있습니다.
Slack에서 다시는 '자리 비움'으로 표시되지 마세요
클라우드 기반. 다운로드 불필요. 노트북이 꺼져 있어도 24시간 작동.
xoxb와 xoxp의 차이
users.profile.set이나, 레퍼런스에 사용자 토큰 범위만 나와 있는 reminders.add입니다(그래도 되는 일은 Slack 리마인더 봇에 있습니다).사용자 토큰에는 사용자가 허용한 사용자 범위도 실립니다. Slack 문서에 따르면 사용자 토큰으로 한 동작은 사용자가 직접 한 것처럼 처리됩니다. 봇 토큰은 이렇게 할 수 없습니다. 저희 as_user 테스트에서는 as_user=true를 붙여도 봇으로 글이 올라갔습니다.
xoxe 토큰과 토큰 순환
앱 설정에서 토큰 순환을 켜면 oauth.v2.access가 43,200초(12시간) 뒤 만료되는 xoxe. 접두사의 액세스 토큰과 xoxe-로 시작하는 새로 고침 토큰을 돌려줍니다. 만료되기 전에 grant_type=refresh_token으로 oauth.v2.access를 호출하면 새 한 쌍을 받습니다. 토큰 순환 테스트에서 새로 고친 뒤 어떤 옛 토큰이 계속 작동하는지, 그리고 순환은 한 번 켜면 다시 끌 수 없다는 것을 확인했습니다.
xapp 앱 수준 토큰
앱 수준 토큰은 xapp-로 시작하고 앱 설정의 Basic Information에서 만듭니다. 메시지를 올리는 용도가 아니라 앱 전체 API용이고, 가장 흔한 것은 Socket Mode 연결입니다.
활동 상태를 설정할 수 있는 토큰은?
users.setPresence는 호출한 사용자의 활동 상태를 away나 auto로 정합니다. 그래서 사용자 토큰이면 그 사용자 자신의 점이, 봇 토큰이면 봇의 점이 바뀝니다. 어떤 토큰으로도 사용자를 강제로 활성으로 만들 수는 없습니다. 코드와 필드는 Slack 활동 상태 API 가이드에 있습니다.
자주 묻는 질문
Slack 봇 토큰은 만료되나요?
토큰 순환을 켜지 않는 한 만료되지 않습니다. 켜면 액세스 토큰이 12시간 뒤 만료되므로 새로 고쳐야 합니다. 순환 없이 쓴 저희 토큰은 앱을 지울 때까지 계속 작동했습니다.
xoxc와 xoxd 토큰은 무엇인가요?
웹 클라이언트의 세션 토큰과 쿠키입니다. Slack xoxc와 xoxd 토큰을 보세요.
Related Articles
Slack Bot Scopes: The Scope Each API Method Needs, Measured on 44 Methods
We gave a Slack bot one scope, called 44 common Web API methods, and read the needed field of every missing_scope error. Then we added the scopes and called them again. The table shows which scope clears each method.
Slack File Size Limit: 1 GB Is Exactly 1,073,741,824 Bytes, Tested
We uploaded files of 50 MB, exactly 1 GiB and 1 GiB plus one byte to Slack through its upload API. The limit is 1,073,741,824 bytes, and a failed upload can still leave a broken file behind.
Slack Dark Mode: Where the Setting Is, and Which Custom Emoji Disappear
Slack's dark mode is under Preferences > Appearance > Color Mode, with Light, Dark and System. We switched modes in Slack web with three test emoji and measured which ones vanish.