버튼 한 번으로 끝나는 인증은 편하지만, 공개 서버에서는 너무 가볍게 느껴질 때가 있습니다.
새 멤버가 안내를 읽었는지 한 번 더 확인하고 싶거나, 봇 자동 가입 스팸을 조금이라도 걸러 내고 싶을 때가 바로 그렇습니다.
이 글에서는 DM으로 인증 코드를 보내고, 유저가 서버로 돌아와 코드를 입력하면 역할을 여는 가장 작은 운영형 구조를 만듭니다.
1. 버튼 인증보다 한 단계 더 확인하고 싶을 때 쓴다
아래 같은 상황에서 잘 맞습니다.
- 입구 안내를 한 번 더 읽게 하고 싶은 경우
- 봇 자동 가입 스팸을 조금 줄이고 싶은 경우
- 인증 버튼보다 한 단계 더 적극적인 행동을 요구하고 싶은 경우
완전한 보안 인증은 아니지만, 공개 서버 입구를 한 번 더 정리하는 용도로는 충분합니다.
2. 코드 인증 전에 정할 것
슬래시 명령어 구조와 역할 구조는 먼저 맞춰 둡니다.
아직 이 단계가 없다면 슬래시 명령어 디스코드 봇 만드는 법, 파이썬 discord.py app_commands 입문과 규칙 동의 인증 디스코드 봇 만들기을 먼저 봐야 합니다.
3. 코드 인증에 필요한 값 넣기
DISCORD_TOKEN=여기에_봇_토큰
GUILD_ID=테스트_서버_ID
VERIFY_ROLE_ID=여기에_인증역할_ID
테스트 단계에서는 서버 단위 sync가 빠릅니다.
글로벌 명령어로 올리면 반영 속도 때문에 디버깅이 느려집니다.
4. 인증 코드 발급과 확인 흐름
import os
import random
import string
import discord
from discord import app_commands
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
GUILD_ID = int(os.getenv("GUILD_ID"))
VERIFY_ROLE_ID = int(os.getenv("VERIFY_ROLE_ID"))
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
guild = discord.Object(id=GUILD_ID)
verification_codes: dict[int, str] = {}
@client.event
async def on_ready():
await tree.sync(guild=guild)
print(f"로그인 성공: {client.user}")
@tree.command(name="인증코드발급", description="DM으로 인증 코드를 발급합니다.", guild=guild)
async def issue_code(interaction: discord.Interaction):
code = "".join(random.choices(string.digits, k=6))
verification_codes[interaction.user.id] = code
try:
await interaction.user.send(f"인증 코드: {code}\n서버로 돌아가 /인증 명령어에 입력해 주세요.")
await interaction.response.send_message("DM으로 인증 코드를 보냈습니다.", ephemeral=True)
except discord.Forbidden:
await interaction.response.send_message("DM을 보낼 수 없습니다. 개인 메시지 허용 설정을 먼저 확인해 주세요.", ephemeral=True)
@tree.command(name="인증", description="발급받은 인증 코드를 입력합니다.", guild=guild)
@app_commands.describe(code="DM으로 받은 6자리 코드")
async def verify(interaction: discord.Interaction, code: str):
expected_code = verification_codes.get(interaction.user.id)
if expected_code is None:
await interaction.response.send_message("먼저 /인증코드발급 명령어를 실행해 주세요.", ephemeral=True)
return
if code != expected_code:
await interaction.response.send_message("인증 코드가 일치하지 않습니다.", ephemeral=True)
return
if interaction.guild is None:
await interaction.response.send_message("서버 안에서만 사용할 수 있습니다.", ephemeral=True)
return
member = interaction.guild.get_member(interaction.user.id)
role = interaction.guild.get_role(VERIFY_ROLE_ID)
if member is None or role is None:
await interaction.response.send_message("멤버 또는 인증 역할을 찾지 못했습니다.", ephemeral=True)
return
try:
await member.add_roles(role, reason="인증 코드 확인 완료")
verification_codes.pop(interaction.user.id, None)
await interaction.response.send_message("인증이 완료되었습니다. 이제 일반 채널을 사용할 수 있습니다.", ephemeral=True)
except discord.Forbidden:
await interaction.response.send_message("봇 권한이 부족해 역할을 지급하지 못했습니다.", ephemeral=True)
if not TOKEN:
raise ValueError("DISCORD_TOKEN 값이 없습니다.")
client.run(TOKEN)
구조 자체는 단순합니다.
DM으로 코드를 보내고, 서버 안에서 코드를 다시 입력해 맞으면 역할을 여는 방식입니다.
5. 재발급부터 만료까지 확인하기
python main.py
그다음 아래 순서로 확인합니다.
/인증코드발급실행- DM에서 6자리 코드 확인
- 서버 안에서
/인증 code:123456실행 - 인증 역할이 붙는지 확인
처음에는 코드 저장을 메모리 딕셔너리로 두면 구현이 빠릅니다.
대신 봇이 재시작되면 기존 코드가 사라집니다.
6. DM 인증에서 자주 막히는 부분
- DM이 안 오는 경우 유저 개인 설정에서 서버 멤버 DM 차단을 켠 경우가 많습니다.
- 코드가 자꾸 틀리는 경우 이전 코드와 새 코드가 섞였을 수 있습니다.
한 번 더 발급한 뒤 최신 코드만 입력해 봅니다. - 역할 지급이 실패하는 경우 여기서도 결국 역할 순서와
Manage Roles권한을 먼저 봐야 합니다.
7. 운영 단계에서는 코드 수명과 재발급 기준을 같이 둔다
실전에서는 발급 코드를 오래 살려 두면 안 됩니다.
예를 들어 10분 뒤 자동 만료되게 하거나, 세 번 틀리면 재발급하게 만드는 식입니다.
여기서 많이 막히는 지점은 코드 검증보다 DM 발송 실패와 봇 재시작입니다.
유저가 DM 차단을 켜 둔 상태인지, 메모리 저장이라 재시작 뒤 코드가 날아가는 구조인지 먼저 설명해 둬야 운영상 훨씬 덜 꼬입니다.
8. 규칙 동의 인증과 어떻게 다를까
규칙 동의 인증은 버튼 한 번으로 역할을 여는 구조입니다.
지금 글의 코드는 유저가 DM을 받고, 다시 서버로 돌아와 직접 코드를 입력합니다.
입구를 조금 더 단단하게 잡고 싶을 때는 지금 방식이 낫고, 초반 커뮤니티 서버처럼 진입 장벽을 낮추고 싶을 때는 규칙 동의 인증 디스코드 봇 만들기 쪽이 더 잘 맞습니다.
9. 배포는 결국 상시 실행 환경이 필요하다
입구 인증은 새 멤버가 언제 들어올지 모르는 기능입니다.
개발 PC를 끄면 인증 흐름도 같이 멈춥니다.
실제 운영용으로 옮길 때는 24시간 디스코드 봇 무료 호스팅, 디스호스트처럼 계속 켜져 있는 서버가 필요합니다.
10. 인증 강도를 높이려면 입구 구조도 같이 바꾼다
인증 구조를 붙였다면 다음에는 새 멤버가 서버 안에서 해야 할 행동을 더 짧고 명확하게 안내해야 합니다.
입구 동선을 이어서 정리할 때는 규칙 동의 인증 디스코드 봇 만들기와 온보딩 체크리스트 디스코드 봇 만들기을 순서대로 보면 인증과 안내를 어떻게 나눌지 감이 빨리 잡힙니다.
'봇 개발 팁 > Discord.py' 카테고리의 다른 글
| 규칙 동의 인증 디스코드 봇 만들기 (0) | 2026.04.22 |
|---|---|
| 반응 역할 디스코드 봇 만들기 (0) | 2026.04.21 |
| 자동 역할 부여 디스코드 봇 만들기 (0) | 2026.04.20 |
| 자동 환영 인사 디스코드 봇 만들기 (0) | 2026.04.19 |
| 디스코드 슬래시 명령어 권한 설정법 (0) | 2026.03.31 |