글자 크기

[혼자서 앱 만들기 #7] 공식 라이브러리가 없다고? 만들면 되지

“이건 진짜 안 될 것 같아.”

카카오 로그인을 붙이려다 막혔다. 구글은 됐다. 애플도 됐다. 그런데 카카오가 안 된다.

gem "omniauth-kakao"  # 설치하면 에러

공식 라이브러리가 OmniAuth 2.x와 호환되지 않았다. GitHub 이슈를 찾아봤다. 2년째 방치.

순간 이런 생각이 들었다.

“그냥 카카오는 빼자. 구글이랑 애플만 있어도 되잖아.”


포기하려던 이유

한국에서 사는 베트남 분들에게 카카오톡은 생활이다.

은행 연락도 카카오. 병원 예약도 카카오. 중고거래 연락도 카카오. 한국 생활의 시작이 카카오톡 설치다.

카카오 로그인이 없으면 반쪽짜리 앱이다.

그걸 알면서도 포기하려 했다. 왜?

두려웠으니까.

라이브러리 없이 OAuth를 직접 구현한다고? 토큰 교환, 콜백 처리, 사용자 정보 파싱… 그런 건 시니어 개발자들이나 하는 거 아닌가?


그래도 해보기로 했다

어느 날, 지난번 글을 다시 읽었다.

“어려워 보이는 것도 일단 시작하면 길이 보인다.”

내가 쓴 말이다. 내가 쓴 말에 내가 속았다.

“그래, 일단 해보자. 안 되면 그때 포기해도 늦지 않아.”


OAuth의 본질

먼저 OAuth가 뭔지 제대로 이해하려고 했다.

1. 사용자가 "카카오 로그인" 클릭
2. 카카오 인증 페이지로 이동
3. 사용자가 카카오에서 로그인
4. 카카오가 우리 앱으로 "코드" 전달
5. 우리 앱이 코드로 "토큰" 교환
6. 토큰으로 사용자 정보 조회
7. 로그인 완료

복잡해 보이지만, 결국 “코드 → 토큰 → 정보” 세 단계다.

이걸 이해하니까 두려움이 줄었다.


100줄짜리 해결책

# lib/omniauth/strategies/kakao.rb
module OmniAuth
  module Strategies
    class Kakao < OmniAuth::Strategies::OAuth2
      option :name, "kakao"
      option :client_options, {
        site: "https://kauth.kakao.com",
        authorize_url: "/oauth/authorize",
        token_url: "/oauth/token"
      }

      uid { raw_info["id"].to_s }

      info do
        {
          name: raw_info.dig("kakao_account", "profile", "nickname"),
          email: raw_info.dig("kakao_account", "profile", "email")
        }
      end

      def raw_info
        @raw_info ||= access_token.get(
          "https://kapi.kakao.com/v2/user/me"
        ).parsed
      end
    end
  end
end

이게 전부다.

40줄. 공식 라이브러리가 하는 일을 40줄로 직접 만들었다.

물론 처음부터 이렇게 깔끔하지 않았다.


삽질의 기록

삽질 1: “토큰 서버가 다르네?”

카카오는 인증 서버와 API 서버가 다르다.

  • 인증: kauth.kakao.com
  • API: kapi.kakao.com

이걸 몰라서 1시간 헤맸다.

삽질 2: “이메일이 왜 안 와?”

카카오는 이메일을 “선택 동의”로만 받을 수 있다. 사용자가 거부하면 이메일 없이 가입된다.

처음엔 버그인 줄 알았다. 30분 삽질.

삽질 3: “배포하면 왜 안 돼?”

로컬에서는 완벽하게 작동했다. 배포하니까 에러.

Zeitwerk::NameError: expected lib/omniauth/strategies/kakao.rb
to define Omniauth::Strategies::Kakao

Rails의 자동 로딩 시스템이 파일 경로를 보고 클래스 이름을 추측한다. lib/omniauth/...를 보고 Omniauth를 기대하는데, 실제 클래스는 OmniAuth다.

대소문자 하나 때문에 2시간.

해결책은 한 줄이었다.

config.autoload_lib(ignore: %w[omniauth])

결국 됐다

노란 버튼을 눌렀다. 카카오 인증 화면이 떴다. 로그인했다.

앱에 들어왔다.

그 순간, 나는 깨달았다.

“공식 라이브러리가 없다는 건 핑계였구나.”

안 되는 이유를 찾으면 끝없이 나온다. 되는 방법을 찾으면 결국 하나는 있다.


무엇이 달라졌나

기술적으로

  • OAuth 2.0의 내부 구조를 이해하게 됐다
  • OmniAuth 전략(Strategy) 패턴을 직접 구현했다
  • Rails Zeitwerk 자동 로딩의 작동 원리를 알게 됐다

마음속으로

“없으면 만들면 된다”는 자신감이 생겼다.

예전에는 라이브러리가 없으면 포기했다. 지금은 “그럼 만들지 뭐”라고 생각한다.

100줄짜리 코드가 나를 바꿨다.


당신에게

지금 무언가 앞에서 막혀 있는가?

  • “라이브러리가 없어서”
  • “문서가 부족해서”
  • “예제가 없어서”

나도 그 핑계를 댔다. 그리고 그 핑계들이 전부 회피였다는 걸 알게 됐다.

없으면 만들면 된다. 부족하면 채우면 된다. 없으면 찾으면 된다.

당신이 생각하는 것보다, 당신은 더 많은 것을 할 수 있다.

일단 시작해보라.


다음 이야기

  • [ ] 카카오 프로필 이미지 연동
  • [ ] 소셜 로그인 통계 대시보드
  • [ ] 앱 성장기 – 첫 100명의 사용자

이 글은 [혼자서 앱 만들기] 시리즈의 7번째 글입니다.
Chợ Việt: 한국의 베트남 커뮤니티를 위한 중고거래 앱

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다