Zero-Ceremony Identity: 내가 Go로 단일 바이너리 OIDC Provider를 만든 이유

발행: (2026년 3월 27일 AM 08:44 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

기존 솔루션의 문제점

Identity infrastructure는 악명 높게 복잡합니다. 일반적인 자체‑호스팅 설정은 다음을 포함합니다:

  • 데이터베이스 서버
  • 캐시 계층 (예: Redis)
  • 워커 큐
  • 아이덴티티 서비스 자체

2 GB RAM 작은 VPS에서 경량 OIDC 서버를 실행해 보니, 기존 환경이 운영적으로 너무 힘들거나 구조적으로 내 요구에 맞지 않다는 것이 금방 드러났습니다.

내가 부족하다고 느낀 점

ProviderIssue
Casdoor데모 인스턴스가 5 분마다 계정을 재활용해 계정 삭제 테스트를 할 수 없습니다.
PocketId기본적으로 Passkey‑전용입니다. 구형 OS나 제한적인 브라우저를 사용하는 사용자는 접근이 차단됩니다.

이러한 장애물 때문에 나는 OIDC 프로토콜 서버(원래는 업무용 프론트엔드 라이브러리를 위해 만들었음)를 전체 IdP로 전환하게 되었고, 끊임없이 스스로에게 물었습니다: 이것이 운영자의 운영 부담을 줄여줄까, 아니면 늘릴까?

Auténtico의 설계 원칙

  • Single binary – 전체 IdP가 하나의 Go 바이너리로 실행됩니다.
  • Embedded SQLite – 모든 상태가 단일 파일에 저장됩니다; 외부 DB 서버가 없어 연결 풀 튜닝, 자격 증명 교체, 네트워크 파티션을 없앨 수 있습니다.
  • Zero external infrastructure – Redis, Postgres, 메시지 큐가 없습니다. 백그라운드 goroutine이 만료된 토큰, 세션, 인증 코드를 자동으로 정리합니다.
  • Embedded UIs – 관리자 대시보드(React/Ant Design)와 사용자용 Account UI(React/Tailwind)가 go:embed를 통해 바이너리에 컴파일됩니다. 별도의 프론트엔드 배포가 필요 없습니다.

유연한 인증 모드

Auténtico는 런타임 중에 전환 가능한 세 가지 인증 모드를 제공합니다 (재시작 필요 없음):

  1. password
  2. password_and_passkey
  3. passkey_only

passkey_only를 사용하는 배포에서 브라우저 호환성 문제가 발생하면, 관리자는 Admin UI에서 설정을 즉시 전환하여 비밀번호로 대체할 수 있습니다. 추가 대체 방법에는 다음이 포함됩니다:

  • TOTP (브라우저 내 QR 등록)
  • 이메일 OTP
  • 하드웨어 기반 FIDO2 인증 (첫 로그인 시 원활한 등록 포함)

수직‑슬라이스 아키텍처

코드베이스는 각 패키지가 기능의 슬라이스를 담당하는 엄격한 수직‑슬라이스 레이아웃을 따릅니다:

pkg/login/
    model.go
    handler.go
    service.go
    // Database CRUD

이와 같은 체계적인 구조는:

  • 코드를 “의도적으로 단순하게” 유지하여 AI 어시스턴트가 보일러플레이트를 쉽게 생성할 수 있게 합니다.
  • 700개 이상의 테스트를 빠르게 생성할 수 있게 하였으며, 약 80 %의 커버리지를 달성했습니다.

성능 및 확장성

SQLite는 쓰기를 직렬화하므로 Auténtico는 액티브‑액티브 다중 지역 배포를 위한 것이 아닙니다. 그럼에도 불구하고 내부 도구와 중소 규모 애플리케이션에 충분히 관대한 성능을 제공합니다.

동시 VU오류율로그인 p95토큰 p95평결
200 %86 ms54 ms편안함 – 감지되지 않음
1000 %611 ms647 ms지원됨 – 완전 기능
5000 %3.36 s3.89 s성능 저하 – 눈에 띄는 지연

테스트는 k6으로 실행되었습니다; SQLite의 busy timeout은 요청을 대기열에 넣어 지연을 추가하고 오류를 발생시키지는 않습니다.

대부분의 팀에게 무한한 수평 확장을 운영 오버헤드 제로와 교환하는 것이 올바른 선택입니다.

Feature checklist

  • OIDC Discovery/.well-known/openid-configuration을 공개합니다.
  • JWK Set/.well-known/jwks.json에서 공개 서명 키를 노출합니다.
  • RS256 JWT signing – 비대칭 서명; 개인 키는 IdP를 떠나지 않습니다.
  • OAuth2/OIDC 프로토콜 구현.
  • Admin UI – 클라이언트, 사용자, 세션을 관리합니다.
  • Account UI – 사용자가 프로필을 관리합니다.
  • Swagger/OpenAPI docs – API 사양이 자동으로 게시됩니다.

Auténtico를 고려해야 할 대상은?

  • 전담 시스템 관리자가 없는 소규모 팀이나 인디 개발자들이 아이덴티티 제공자가 필요할 때.
  • 내부 도구, 자체 호스팅 환경, 혹은 대규모 수평 확장보다 운영의 단순함이 더 중요한 중소 규모 애플리케이션을 운영하는 조직.

GitHub:

0 조회
Back to Blog

관련 글

더 보기 »

SQLite는 어떤 인덱스를 사용해야 합니까?

인덱스가 존재하더라도, 잘못된 인덱스를 선택하면 쿼리가 크게 느려질 수 있습니다. 옵티마이저의 역할은 단순히 인덱스를 사용하는 것이 아니라, 올바른 인덱스를 사용하는 것입니다.

지난 몇 달 동안 Go 학습

첫 몇 주: Your Wall 찾기: Beginner Frustration Channels를 Reinforcement Tool로 활용하기 막혔나요? 여기 아직도 나를 당황하게 하는 것들 Pointers는 M에게 거짓말을 하지 않는다.

코딩 전 나의 계획

1️⃣ 전략 “Ask” 세 가지 핵심 질문 - 이것은 누구를 위한 것인가? Target Audience - 내가 정확히 해결하고자 하는 문제는 무엇인가? Pain Points - 성공은 어떤 모습인가?