Go로 인증서버 만들기 #0 개발을 시작하며

펜타곤·2023년 3월 19일
2
post-thumbnail

1. 왜 개발하게 되었는가?

2023년을 맞아 우리 창업동아리 #IMPLUDE는 실제 창업을 진행하기로 하였다.

작년에 공개SW개발자대회에서 수상한 "잇는"을 실사업에 운용할 수 있게 개량하고
"코딩튜터"라는 서비스를 새로 선보이기로 했다.

또한 우리는 사업자 "빌드인"으로 시작하여 해를 거듭하며 다양한 서비스를 추가해 나가,
하나의 플랫폼으로 발전해 나가려고 한다.

"이를 위해 우리는 중앙화된 계정시스템의 구축의 필요성을 느꼈다"



2. 기술 스택 선정

  • 기술 스택의 선정은 다음과 같이 이루어 졌다.

"빠른 처리"와 "타입 안정성"을 위한 "Go"언어와 "Fiber", "Redis"

"정형화 데이터"와 "데이터 안정성"을 위한 "PostgresSQL"

"이식 용이성"을 위한 "Docker"

를 사용하기로 하였다.



3. 개발 계획 수립


(1) DB에 저장할 정보

서비스 별로 유저에게 필요한 정보가 다 다르다.

프로젝트 "잇는"은 이메일, 사용자가 주거하는 행정구역, 생년월일, 직업, 전공 등등의 정보가 필요하다.
반면 프로젝트 "코딩튜터"는 이메일, 실명, 전화번호, 주소, 학교급 등이 필요하다.

이 많은 정보를 다 한 곳에 다 저장하면, 추후 Scale Out을 해 나감에 있어 불편한 요소로 작용할 것이다.

고유ID / 이메일 / 패스워드해시 / 생성일자

위와 같이 모든 서비스에서 공통적으로 필요한 정보들만 인증서버 DB에 보관하고
나머지는 각 서비스들의 DB에 저장하여 서비스 별로 Scale Out이 편한 아키텍쳐를 설계하였다


(2) JWT로 전달할 정보

우리 프로젝트에서 "이메일"과 "생성일자"는 서비스를 이용하면서 자주 접근하는 정보가 아니다.

따라서

고유ID만 저장함으로 "네트워크 대역폭을 절약"

하는 방법을 선택하게 되었다


(3) API Endpoint 설계

인증 파트

Login - POST /auth/login
Logout - GET /auth/logout
Register - POST /auth/register

Access Token Refresh - GET /auth/refrsh

Password Change - GET /auth/changepass
Email Verification - GET /auth/verify/{purpose}

정보 파트 - 인증 미들웨어 적용

Valid User Check - GET /info
Get User Email - GET /info/email


(4) 네트워크 설계

도커를 사용하여 배포하고, 서비스 별로 컨테이너가 추가 할 것이다.

인증 서버 - 서비스 서버 간의 통신은 Docker 네트워크를 만들어 로컬로 연결하고

인증 서버 - 사용자, 서비스 서버 - 사용자 간의 통신은 CloudFlare Argo Tunnel을 활용하여, 공인IP 없이도 손쉽게 배포할 수 있게 설계하였다.

아래는 docker-compose.yml 파일이다

version: "3.7"

services:
  portainer-ce:
    container_name: main-portainer
    image: portainer/portainer-ce:latest
    restart: always
    expose:
      - "8000"
      - "9000"
      - "9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer/data:/data
      - /etc/localtime:/etc/localtime:ro 
    networks:
      - main_net

  tunnel:
    container_name: main-cloudflared-tunnel
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel run
    env_file:
      - .env
    networks:
      - main_net


networks:
  main_net:
    driver: bridge

Github Link



5. 마무리

비교적 최근에 개발된 Go언어는
이제 1.20.2 버전까지 출시되어 여러 개선을 거듭했다.

그러나 아직 국내에 Go언어로 개발하는 개발기가 많지 않다.

완벽하게 깔끔한 코드는 아니지만,
Go언어를 시작하는 개발자들이 앞으로 작성할 내 글을 보고 조금은 정보를 얻어 갈 수 있기를 바란다.

profile
모난 예비 개발자 펜타곤

0개의 댓글