AWS 기술 블로그
알라딘의 Amazon Cognito를 활용한 백오피스 인증 체계 구축
회사 소개
알라딘 커뮤니케이션 은 ‘알라딘’과 ‘알라딘 중고서점’으로 널리 알려진 온‧오프라인 서점입니다. ‘알라딘’이라는 브랜드에는 고객의 꿈을 이루어드리고자 하는 기업정신이 담겨 있으며, 이를 기술로 실현하고자 합니다.
1998년 설립 이후 1999년 온라인 서점 오픈을 시작으로, 현재 전국 58개 알라딘 중고서점을 운영하며 약 2,000만 회원과 함께하고 있습니다. 도서 판매를 넘어 음반, DVD, 커피 원두 등 다양한 문화생활 상품으로 영역을 넓히는 과정에서 알라딘은 자체 호스팅 환경에서 끊임없이 기술적 혁신을 추구해왔습니다.
2023년에는 콘텐츠 창작 플랫폼 ‘투비컨티뉴드’를 출시했으며, 2025년에는 전자책 구독 서비스 ‘만권당’을 선보였습니다. 이러한 서비스 확장의 기반에는 알라딘의 기술적 역량과 끊임없는 도전 정신이 있습니다.
올해 2025 서울국제도서전 공식 협찬사로 참가하며 독자들의 뜨거운 호응을 얻었고, 특히 서비스 품질과 보안 강화를 위해 AWS 클라우드 기반으로 서버를 대거 이전했습니다. 이 과정에서 직면한 기술적 도전과 해결 방법, 그리고 보안 인프라 구축과 전문 인력 확보를 통해 알라딘은 안정성, 확장성, 보안성을 갖춘 문화/기술 융합 플랫폼으로 도약하고 있습니다.
배경
알라딘은 약 1년 전부터 사내 시스템을 모놀리식 구조에서 마이크로서비스 아키텍처(MSA)로 전환하기 시작했으며, 이에 따라 여러 개의 사내 백오피스 시스템에 공통으로 적용할 수 있는 인증 및 인가 체계의 중앙화와 표준화가 중요한 과제로 떠올랐습니다.
기존에는 각 백오피스 서비스가 자체적으로 인증 로직을 구현하고 있었고, 사용자 인증 정보는 RDBMS에 저장되어 있었습니다. 인증 로직이 서비스마다 중복 구현되다 보니 유지보수에 어려움이 있었고, 보안 정책의 일관성 확보나 감사 대응에도 한계가 있었습니다. 또한, 인증/인가와 같은 횡단 관심사(Cross-Cutting Concern)를 일관되게 다루기 어려운 구조였기 때문에 MSA 환경에 적합한 새로운 접근 방식이 필요했습니다.
알라딘은 이러한 문제를 해결하기 위해, AWS에서 제공하는 Amazon Cognito를 통해 인증(Authentication)을 중앙화하고, Amazon API Gateway를 활용해 모든 백오피스 서비스의 요청에 대해 JWT 기반 Token 검증을 일관되게 수행하도록 구성했습니다. 인가(Authorization)는 오픈소스(Keycloak)을 통해 역할 기반 접근 제어(RBAC)를 유연하게 처리하는 구조로 분리했습니다.
이 글에서는 Amazon Cognito + Keycloak 조합으로 사내 인증/인가 체계를 구축한 실전 사례를 중심으로, API Gateway를 통한 인증 Token 검증 방식과 함께 인증/인가의 책임을 분리한 설계 전략을 소개합니다. 이를 통해 인증과 같은 횡단 관심사를 보안성과 운영 안정성 측면에서 표준화된 방식으로 구현하고자 하는 기업들에게, 실질적인 아키텍처 대안과 참고할 수 있는 방향성을 제시하고자 합니다.
분석 및 설계
기존 시스템의 한계
기존의 사내 시스템은 전반적으로 .NET Framework 기반의 모놀리식 구조로 구성되어 있었으며, 각 백오피스 서비스는 자체적으로 인증 기능을 구현하고, 사용자 인증 정보는 RDBMS에 암호화하여 저장하였습니다. 이러한 방식은 초기에는 빠르게 구축할 수 있다는 장점이 있었지만, 시간이 지남에 따라 다음과 같은 구조적 한계가 드러났습니다.
- 인증 로직의 기술 종속성과 버전 관리 문제: 사용자 패스워드 암호화 로직이 .NET DLL 파일에 종속되어 있었고, 해당 DLL은 파일 시스템을 통해 수동 배포되면서 백오피스 서비스 간 버전 불일치가 자주 발생했습니다. 또한 Java기반(JVM)의 신규 서비스에서는 해당 DLL을 사용할 수 없어, 인증 로직을 재구현해야 하는 이식성 문제도 함께 존재했습니다.
- 중복된 인증 로직의 확산: 로그인, 비밀번호 검증, 세션 관리 등 기본적인 인증 기능이 서비스마다 중복 구현되어 있었고, 보안 정책 변경이나 기능 개선 시 모든 시스템을 개별 수정해야 하는 비효율이 발생했습니다.
- 보안 정책의 일관성 부재: MFA, 계정 잠금, 비밀번호 복잡도 정책 등 보안 기능의 적용 여부와 방식이 서비스마다 상이했고, 일부 시스템에는 해당 기능이 제공되지 않거나 비활성화된 경우도 존재했습니다. 또한 사용자 패스워드는 데이터베이스에 암호화하여 저장하고 있음에도 불구하고, 인증 요청 처리 과정에서 평문 상태로 내부 로직을 거치는 구조였기 때문에, 로그 출력이나 디버깅 과정에서 평문 노출 가능성이 존재했습니다. 이러한 상황은 전체 시스템 보안의 일관성 확보와 외부 감사 대응에 있어 개선의 여지를 남겼습니다.
- 운영/확장의 비효율성: 신규 백오피스 시스템 도입 시마다 인증 로직을 별도로 구현하거나 DLL 종속성을 해결해야 했고, 이는 개발 일정 지연 및 운영 리스크 증가로 이어졌습니다. 또한 직원 계정 정보가 다른 시스템과 공유하는 단일 RDBMS에 저장되어 있었기 때문에, 다른 시스템에서 장애가 발생할 경우 인증 기능까지 함께 영향을 받아 전체 백오피스 서비스에 장애가 전파되는 구조적 문제도 존재했습니다.
이러한 문제는 점점 늘어나는 백오피스 시스템과 강화되는 보안 요구사항, 그리고 ISMS 인증과 같은 외부 감사 대응에 있어 한계를 드러냈고, 결국 인증이라는 횡단 관심사를 통합 관리할 수 있는 표준화된 구조로의 전환이 필수적이라는 판단에 이르게 되었습니다.
왜 Amazon Cognito를 선택했는가
새로운 인증 시스템을 구축하기 위해 알라딘은 여러 가지 대안을 검토했습니다.
- 인증 시스템 직접 구현
- 기존 온프레미스 환경의 Active Directory(AD) 연동
- 오픈 소스 솔루션 도입: 기능을 커스터마이징하고, 운영까지 직접 관리
- 완전 관리형 솔루션 사용: 표준 기능을 사용하며, 운영을 벤더에 위임
사내 시스템이 점차 클라우드 환경으로 전환되고 있고, 인증은 보안상 민감하고 반복적인 기능인 만큼, 직접 구현하거나 온프레미스에 의존하는 구조는 유지보수와 확장 측면에서 비효율적이라는 판단이 내려졌습니다. 이러한 이유로 1번, 2번 방안은 적합하지 않았습니다. 완전 관리형 솔루션을 선택한 이유는 다음과 같습니다.
- 보안 기준과 규정 대응 인증 시스템에 요구되는 MFA, 비밀번호 정책, 세션 관리, 디바이스 관리, 감사 로그 등 다양한 보안 기능을 빠르게 도입할 필요가 있었고, 이는 단순한 편의성뿐 아니라, ISMS와 같은 국내 보안 인증 기준에 부합하는 체계적인 인증 구조 마련이라는 관점에서도 중요한 고려사항이었습니다.
- 안정성과 신뢰성 확보 이러한 기능들을 하나하나 개발하고 유지한다는 것은, 마치 데이터를 관리하기 위해 DBMS를 직접 구현하는 것과도 같은 수준의 리스크와 복잡도를 감수해야 하는 일이었습니다. 특히 인증 시스템은 단 한 번의 실패만으로도 전체 서비스 접속이 불가능해질 수 있으며, 회사 매출에 직접적인 영향을 줄 수 있는 핵심 인프라이기 때문에, 절대적으로 높은 안정성과 가용성이 보장된 매니지드 서비스를 선택하는 것이 전략적으로 타당하다고 판단되었습니다.
- 비용 효율성 비용 측면에서도 Amazon Cognito는 알라딘에 매우 합리적인 선택이었습니다. 최대 5만 명까지는 추가 비용 없이 사용할 수 있는 요금 정책 덕분에, 오픈소스 솔루션을 직접 운영하면서 발생하는 서버 유지비, RDS 운영 비용, 보안 업데이트 관리 비용 등을 고려했을 때 오히려 Cognito를 사용하는 것이 더 저렴하고 단순한 선택이었습니다. 특히 직원 계정 관리에는 복잡한 관계형 데이터 모델이 필요한 상황이 아니었기 때문에, 관계형 DB를 기반으로 인증 시스템을 구성하는 것 자체가 불필요한 리소스를 야기할 수 있는 구조였고, 이러한 점에서도 Cognito의 구조적 간결함은 큰 장점이었습니다.
최종 선택: Amazon Cognito
알라딘은 이러한 요건을 충족하는 솔루션으로 Amazon Cognito를 선택하게 되었습니다.
Amazon Cognito는 사용자 관리부터 인증, 다단계 인증(MFA), 관리형 로그인, 세션 관리와 로그 추적 등 기업 내부 시스템에서 요구되는 인증 기능 전반을 매니지드 서비스로 제공하며, AWS 서비스와의 통합, 보안 규정 준수, 확장성, 장애 대응 능력 측면에서도 강점을 가지고 있었습니다.
무엇보다도, Cognito는 직원 계정 중심의 인증 시스템을 별도 서버 구축 없이 빠르게 구현할 수 있도록 해주었고, 백오피스 계정이 AD에 종속되지 않은 기업 환경에서도 손쉽게 인증 체계를 표준화할 수 있는 기반이 되어 주었습니다.
Amazon Cognito를 어떻게 구성했는가
알라딘은 Amazon Cognito를 중심으로 사내 백오피스의 인증(Authentication) 시스템을 중앙화하고, JWT Token 검증 및 인증 관련 횡단 관심사는 AWS API Gateway에서 전담하도록 구성했습니다. 각 백오피스 서비스는 API Gateway를 통해 인증된 요청만을 받아, 비즈니스 성격에 맞는 인가(Authorization) 처리를 자체적으로 수행합니다.
정리하면 다음과 같은 흐름입니다:
- Amazon Cognito는 직원 로그인과 인증을 담당하고,
- API Gateway는 요청에 포함된 JWT Token을 검증하여 유효성을 확인하며,
- 각 백오피스 서비스는 인증된 요청을 받아, Token에서 인증 정보를 바탕으로, 권한 확인을 하여 인가를 자율적으로 수행합니다.
이 구조를 통해 인증은 표준화하면서도, 서비스별 인가 정책의 유연성을 함께 확보할 수 있었습니다.
개발 과정
코드 공통화
위의 설계를 중심으로 발급 받은 Token을 브라우저에 보관하여 사용합니다. 그리고 백오피스 개발에 적용하며 중복되는 몇 가지의 화면 기능들을 발견할 수 있었습니다. 알라딘은 이 기능들을 하나로 공통화하여 Frontend 단의 Base 프로젝트를 만들었습니다. 이 덕분에 개발자의 개발 리소스가 줄어들었고, 다른 개발자에게도 좋은 레퍼런스가 될 수 있었습니다.
1. 로그인
아래와 같은 경우 Cognito Hosted UI로 리디렉션하여 로그인을 수행합니다.
- 발급 받은 Token이 없을 경우.
- refresh token으로 토큰 재발급 요청 시, API Gateway로부터 400 상태코드를 응답받을 경우
로그인 완료 후 Cognito는 Authorization Code를 포함한 상태로 백오피스의 Redirect URI로 리디렉션합니다. 클라이언트에서는 이 코드를 감지해 Token 발급을 요청하고, 응답받은 Token을 localStorage
에 저장합니다.
const AuthCallback = () => {
const searchParams = new URLSearchParams(window.location.search);
const code = searchParams.get("code");
useEffect(() => {
if (!code) {
// Authorization code 없을 시 로그인 페이지로 이동
window.location.replace(`/login?client_id=${CLIENT_ID}&response_type=code&scope=email+profile+openid&redirect_uri=${REDIRECT_URI}`);
return;
}
// Cognito에 토큰 발급 요청
issueToken(code)
.then((res) => {
const { access_token, refresh_token } = res.data;
// 성공 시 토큰 저장 및 메인 페이지로 이동
localStorage.setItem("access_token", access_token);
localStorage.setItem("refresh_token", refresh_token);
window.location.replace("/main");
})
.catch(() => {
// 에러 발생 시 저장된 토큰 제거 및 로그아웃
logout();
});
}, []);
return null;
};
2. Token 재발급
Token 인증 방식의 최대 단점은 탈취되었을 경우, 무효화하기 어렵다는 것입니다. 알라딘은 Access Token 의 만료시간을 가장 짧은 5분으로 설정하였고 필요 시 Refresh Token으로 Access Token을 재발급 받는 방식을 채택하였습니다. 모든 백오피스의 Refresh Token은 Cognito에서 즉시 무효화가 가능했습니다. 이렇게 해서 효율성과 보안성을 모두 챙길 수 있었습니다.
const apiClient = axios.create({});
apiClient.interceptors.request.use(
(config) => {
const accessToken = localStorage.getItem("access_token");
// header에 access token 주입
if (accessToken) {
config.headers.Authorization = `Bearer ${accessToken}`;
}
return config;
},
(error) => {
throw error;
},
);
apiClient.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
// 401 Unauthorized 에러 발생 시
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
const refreshToken = localStorage.getItem("refresh_token");
// Refresh token으로 토큰 재발급 요청
const { data } = await reissueToken(refreshToken);
// 새 토큰 저장 및 재요청
localStorage.setItem("access_token", data.access_token);
return await apiClient(originalRequest);
} catch {
// 재발급 실패 시 저장된 토큰 제거 및 로그아웃
logout();
}
}
return Promise.reject(error);
}
);
3. 로그아웃
Cognito는 logout 엔드포인트를 사용하여 사용자를 로그아웃하고, 앱 클라이언트의 권한이 부여된 로그아웃 URL 또는 login 엔드포인트로 손쉽게 리디렉션 가능합니다.
const logout = () => {
localStorage.removeItem("access_token");
localStorage.removeItem("refresh_token");
window.location.replace(`/logout?client_id=${CLIENT_ID}&logout_uri=${LOGOUT_URI}`);
}
계정 관리 백오피스
또한, 알라딘은 직원 계정의 생성 및 관리를 위해 별도의 계정 관리 백오피스를 운영하고 있으며, 이 계정 관리 백오피스의 로그인 기능 또한 Cognito의 관리형 로그인 기능을 이용하고 있습니다. 이 백오피스를 통해 실무자가 Amazon Cognito User Pool에 계정을 등록하거나 수정, 비활성화 처리할 수 있도록 구성했습니다. 즉, Amazon Cognito는 단순한 로그인 시스템이 아닌, 사내 계정 전반을 통합적으로 관리하는 플랫폼 역할도 함께 수행하고 있습니다.
통합 계정 관리 백오피스 예시 화면
Amazon Cognito 도입 이후, 결과
Amazon Cognito를 도입하면서, 기존 인증 시스템의 한계를 해결하는 것을 넘어 보안, 운영, 확장성 측면에서 여러 긍정적인 효과를 경험할 수 있었습니다.
먼저, 인증 기능을 Cognito와 API Gateway로 분리하면서 서비스와 인증 시스템 간의 결합도가 낮아졌고, 그 결과 인증 계층에서 발생하는 장애가 다른 백오피스 서비스로 전파되지 않는 안정적인 구조를 확보할 수 있었습니다.
또한, 기존에는 서비스별로 분산되어 있던 계정 관리 로직을 하나로 통합하여, 사내 전용 계정관리 백오피스를 통해 모든 계정을 일관되게 관리할 수 있게 되었고, 이로 인해 운영 효율성이 크게 향상되었습니다.
Cognito의 MFA, 비밀번호 정책, 계정 잠금 정책 등을 통해 보안 기준을 체계적으로 적용할 수 있었고, CloudTrail 기반의 감사 로그 관리까지 가능해지면서 ISMS 대응 관점에서도 기반 체계가 자연스럽게 마련되었습니다.
무엇보다, 신규 서비스를 도입할 때마다 매번 인증 로직을 구현할 필요 없이 JWT 기반의 검증만 추가하면 바로 연동 가능한 구조가 되어, MSA 전환 속도도 함께 가속화되었습니다.
비용 측면에서도, Cognito는 5만 명까지는 추가 요금 없이 사용할 수 있는 매니지드 서비스이기 때문에 직접 운영하거나 오픈소스를 구축하는 것보다 비용과 리스크 면에서도 더 효율적인 선택이었습니다.
서비스별 분산 계정 관리 통합
마무리 : 앞으로 기대되는 확장 가능성
Amazon Cognito 도입은 알라딘에게 단순한 백오피스 인증 통합 그 이상의 의미를 가집니다. 이번 전환을 통해 알라딘은 보다 안전하고 확장 가능한 인증 기반을 구축하는 첫걸음을 내딛었습니다.
이전까지 분산되어 있던 인증 시스템들이 하나로 통합되면서, 일관된 보안 정책 적용이 가능해졌고, 운영 효율성도 크게 향상되었습니다. 특히 표준 프로토콜을 준수하는 Cognito의 특성 덕분에, 향후 사내 파일 서버, 소스코드 저장소, 그룹웨어 등 다양한 업무 도구들을 하나의 인증 체계로 연결할 수 있는 길이 열렸습니다.
이러한 통합 인증 환경은 단순히 기술적 편의를 넘어, 직원들에게 보다 일관된 사용자 경험을 제공하고, IT 부서의 계정 관리 부담을 줄이며, 회사 전체의 보안 체계를 강화하는 데 기여할 것입니다. 또한 Cognito가 표준 프로토콜을 사용함으로써, 미래에 다른 인증 솔루션으로 전환하게 되더라도 큰 혼란 없이 이전할 수 있는유연성도 확보하게 되었습니다.
알라딘은 이번 Cognito 도입을 시작으로, 앞으로도 계속해서 클라우드 네이티브 환경에 최적화된 인프라를 구축하며 더 안정적이고 혁신적인 서비스를 제공하기 위해 노력할 것입니다.