Apache APISIX와 Authing을 사용한 중앙 집중식 인증 관리 구현

API7.ai

January 4, 2022

Ecosystem

소개

Apache APISIX 소개

Apache APISIX는 동적, 실시간, 고성능 API 게이트웨이로, 로드 밸런싱, 동적 업스트림, 카나리 릴리스, 서비스 장애 조치, 인증, 관찰 가능성 등 다양한 트래픽 관리 기능을 제공합니다. Apache APISIX는 동적 플러그인 변경 및 핫 플러그인을 지원할 뿐만 아니라, 여러 유용한 플러그인을 제공합니다. OpenID Connect 플러그인을 통해 Apache APISIX는 Authing 서비스와 인터페이스할 수 있으며, 기업 내 중앙 집중식 인증 게이트웨이로 배포될 수 있습니다.

Authing 소개

Authing은 중국 최초의 개발자 중심의 풀 스펙트럼 ID 클라우드 제품으로, 모든 주요 ID 프로토콜을 통합하고 기업 및 개발자에게 완전하고 안전한 사용자 인증 및 접근 관리 서비스를 제공합니다. "API First"를 제품의 기반으로 삼아, ID 분야의 모든 일반적인 기능을 모듈화하고, 모든 기능을 풀 스펙트럼 프로그래밍 언어 SDK를 통해 개발자에게 API로 제공합니다. 동시에, 사용자는 Authing의 오픈 RESTful API를 유연하게 사용하여 다양한 비즈니스 시나리오에서 기업의 ID 관리 요구를 충족할 수 있습니다.

중앙 집중식 인증이란?

전통적인 인증 방식

전통적인 인증 방식에서는 각 백엔드 애플리케이션 서비스가 별도의 기능을 개발하여 인증 기능을 지원해야 합니다. 예를 들어, ID 제공자와 상호 작용하고 사용자의 ID 정보를 얻는 등의 작업이 필요합니다.

전통적인 인증 방식

중앙 집중식 ID 인증 방식

전통적인 인증 방식과 달리, 중앙 집중식 인증 방식은 사용자 인증을 애플리케이션 서비스에서 분리합니다. Apache APISIX를 예로 들면, 중앙 집중식 인증 프로세스는 위 그림과 같습니다: 먼저 사용자가 요청을 시작하면, 프론트 게이트웨이가 사용자 인증 프로세스를 담당하고, ID 제공자와 인터페이스하여 ID 제공자에게 인증 요청을 보냅니다. ID 제공자는 사용자 정보를 반환합니다. 게이트웨이가 사용자 식별을 완료한 후, 사용자 ID 정보를 요청 헤더 형태로 백엔드 애플리케이션에 전달합니다.

중앙 집중식 인증 방식

중앙 집중식 ID 인증 방식의 장점

전통적인 인증 방식과 비교하여, 중앙 집중식 인증 방식은 다음과 같은 장점이 있습니다.

  1. 애플리케이션 개발 프로세스를 단순화하고, 애플리케이션 작업량 및 유지 보수 비용을 줄이며, 각 애플리케이션마다 인증 로직을 반복적으로 개발하는 것을 방지합니다.
  2. 비즈니스 보안을 향상시킵니다. 중앙 집중식 인증 방식은 게이트웨이 수준에서 인증되지 않은 요청을 즉시 차단하여 백엔드 애플리케이션을 보호합니다.

동시에, Authing의 강력한 인증 관리 기능과 결합하여 다음과 같은 기능을 구현할 수 있습니다.

  1. 콘솔을 통해 인증 서비스의 생명주기 관리, 생성, 활성화, 비활성화 등을 수행합니다.
  2. 실시간, 시각적 애플리케이션 모니터링, 인터페이스 요청 수, 인터페이스 호출 지연 시간 및 인터페이스 오류 정보, 실시간 알림 등을 제공합니다.
  3. 중앙 집중식 로깅을 통해 사용자 로그인, 로그아웃, 애플리케이션 조정 및 수정 정보를 쉽게 확인할 수 있습니다.

더 자세한 내용은 Authing Access Gateway에서 확인할 수 있습니다.

Apache APISIX와 Authing을 사용하여 중앙 집중식 ID 인증 구현 방법

1단계: Authing 구성

  1. Authing 계정에 로그인하고, 앱을 생성하고 앱 이름과 인증 주소를 입력합니다. Authing 계정이 없는 경우 Authing을 방문하여 오른쪽 상단의 "로그인/등록"을 클릭하여 Authing 계정을 등록하세요. Authing 구성
  2. 생성 버튼을 클릭하여 Authing 애플리케이션을 생성합니다. Authing 애플리케이션 생성
  3. 인증 과정에서 Authing은 구성된 콜백 URL 이외의 URL을 거부합니다. 이는 로컬 테스트이므로, 로그인 콜백 URL과 로그아웃 콜백 URL을 APISIX 접근 주소 http://127.0.0.1:9080/로 설정합니다. 로그인 및 로그아웃 URL 설정
  4. 사용자 생성 (선택 사항). 사용자 목록 페이지에서 계정/비밀번호 user1/user1로 사용자를 생성하고, "사용자 정보 - 권한 관리" 페이지에서 애플리케이션 접근 허용 여부를 설정할 수 있습니다 (기본값은 허용). 사용자 생성
  5. 애플리케이션 페이지를 방문하여 다음 구성을 확인합니다. 이는 Apache APISIX OpenID Connect를 구성할 때 필요합니다.
    1. App ID: OAuth 클라이언트 ID, 즉 애플리케이션의 ID로, 아래의 client_id{YOUR_CLIENT_ID}에 해당합니다.
    2. App secret: OAuth 클라이언트 시크릿, 즉 애플리케이션 키입니다. 아래의 client_secret{YOUR_CLIENT_SECRET}에 해당합니다.
    3. Service_discovery_address: 애플리케이션 서비스 디스커버리 주소입니다. 아래의 {YOUR_DISCOVERY}에 해당합니다. 구성

2단계: Apache APISIX 설치

Apache APISIX는 소스 패키지, Docker, Helm Chart 등 다양한 방법으로 설치할 수 있습니다.

의존성 설치

Apache APISIX 런타임 환경은 NGINX와 etcd에 의존합니다.

Apache APISIX를 설치하기 전에 사용 중인 운영 체제에 따라 의존성을 설치하세요. CentOS7, Fedora 31 및 32, Ubuntu 16.04 및 18.04, Debian 9 및 10, macOS에 대한 의존성 설치 지침을 제공합니다. 자세한 내용은 의존성 설치를 참조하세요.

RPM 패키지를 통한 설치 (CentOS 7)

이 설치 방법은 CentOS 7에 적합하며, 다음 명령어를 실행하여 Apache APISIX를 설치하세요.

sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm

Docker를 통한 설치

Docker를 사용한 Apache APISIX 설치를 참조하세요.

Helm Chart를 통한 설치

Helm Chart를 사용한 Apache APISIX 설치를 참조하세요.

소스 릴리스를 통한 설치

  1. apisix-2.7이라는 디렉토리를 생성합니다.
mkdir apisix-2.7
  1. Apache APISIX 릴리스 소스 패키지를 다운로드합니다.
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz

Apache APISIX 웹사이트에서도 Apache APISIX 릴리스 소스 패키지를 다운로드할 수 있습니다. Apache APISIX 공식 웹사이트 - 다운로드 페이지에서 Apache APISIX, APISIX Dashboard, APISIX Ingress Controller의 소스 패키지를 제공합니다.

  1. Apache APISIX 릴리스 소스 패키지를 압축 해제합니다.
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
  1. 런타임에 필요한 Lua 라이브러리를 설치합니다.
# apisix-2.7 디렉토리로 이동
cd apisix-2.7
# 의존성 생성
make deps

의존성 초기화

다음 명령어를 실행하여 NGINX 구성 파일과 etcd를 초기화합니다.

# NGINX 구성 파일과 etcd 초기화
make init

3단계: Apache APISIX 시작 및 라우트 구성

  1. 다음 명령어를 실행하여 Apache APISIX를 시작합니다.

    apisix start
    
  2. 라우트를 생성하고 OpenID Connect 플러그인을 구성합니다. OpenID Connect 구성 목록은 다음과 같습니다.

필드기본값설명
client_idN/AOAuth 클라이언트 ID
client_secretN/AOAuth 클라이언트 시크릿 키
discoveryN/AID 제공자의 서비스 디스커버리 엔드포인트
scopeopenid접근해야 할 리소스 범위
relmapisixWWW-Authenticate 응답 헤더 인증 정보 지정
bearer_onlyfalse요청 헤더의 토큰을 확인할지 여부
logout_path/logout로그아웃 URI
redirect_urirequest_uriID 제공자가 반환할 URI, 기본값은 요청 주소
timeout3요청 시간 초과 시간 (초)
ssl_verifyfalseID 제공자의 SSL 인증서 확인 여부
introspection_endpointN/AID 제공자의 토큰 인증 엔드포인트 URL, 비어 있으면 디스커버리 응답에서 추출됩니다.
introspection_endpoint_auth_methodclient_secret_basic토큰 인트로스펙션을 위한 인증 방법 이름
public_keyN/A인증 토큰을 위한 공개 키
token_signing_alg_values_expectedN/A인증 토큰을 위한 알고리즘
set_access_token_headertrue요청 헤더에 액세스 토큰을 포함할지 여부
access_token_in_authorization_headerfalse액세스 토큰을 Authorization 헤더에 포함할지 여부, false인 경우 X-Access-Token 헤더에 포함됩니다.
set_id_token_headerfalseX-ID-Token 요청 헤더에 ID 토큰을 포함할지 여부
set_userinfo_headerfalseX-Userinfo 요청 헤더에 사용자 정보를 포함할지 여부

다음 코드 예제는 Apache APISIX Admin API를 통해 라우트를 생성하고, 라우트 업스트림을 httpbin.org로 설정합니다. httpbin.org는 요청을 받고 응답하는 간단한 백엔드 서비스로, 아래에서 httpbin.orgget 페이지를 사용합니다. 자세한 내용은 http bin get을 참조하세요.

구성 항목에 대한 자세한 내용은 Apache APISIX OpenID Connect 플러그인을 참조하세요.

curl  -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"{YOUR_CLIENT_ID}",
            "client_secret":"{YOUR_CLIENT_SECRET}",
            "discovery":"https://{YOUR_DISCOVERY}",
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"apisix",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        "type":"roundrobin",
        "nodes":{
            "httpbin.org:80":1
        }
    }
}'

4단계: Apache APISIX 접근

  1. "http://127.0.0.1:9080/get"에 접근하면 OpenID Connect 플러그인이 활성화되어 있으므로 페이지가 Authing 로그인 페이지로 리디렉션됩니다 (이 페이지는 Authing 콘솔의 "애플리케이션 - 브랜딩"에서 사용자 정의할 수 있습니다). Apache APISIX 접근

  2. Authing에 등록된 사용자 계정의 비밀번호 또는 1단계에서 생성한 사용자 user1/user1의 비밀번호를 입력하고 로그인을 클릭하여 Authing 계정에 로그인합니다.

  3. 로그인에 성공하면 httpbin.org의 get 페이지에 성공적으로 접근할 수 있습니다. httpbin.org/get 페이지는 다음과 같이 요청된 데이터를 반환합니다.

    ...
    "X-Access-Token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InFqeU55aVdVd2NhbUFxdEdVRUNCeFNsTWxQSWtTR2N1NmkyZzhEUk1OSGsifQ.eyJqdGkiOiJjTy16a0pCS0NSRFlHR2kyWkJhY0oiLCJzdWIiOiI2MWM5OGFmOTg0MjI4YWU0OTYyMDU4NTIiLCJpYXQiOjE2NDA1OTg4NTgsImV4cCI6MTY0MTgwODQ1OCwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSIsImlzcyI6Imh0dHBzOi8vYXBpc2l4LmF1dGhpbmcuY24vb2lkYyIsImF1ZCI6IjYxYzk4M2M0YjI4NzdkNDg2OWRkOGFjYiJ9.l2V8vDWcCObB1LjIhKs2ARG4J7WuB-0c-bnYZG2GP2zcpl6PMAPcId2B76CaXCU58ajGcfRmOlWJ67UaHrfWKv8IM4vcYN1gwhKdokSyrhEM31gQE-MzNEsEbPaVIGXdpR1N2JnAJK5-tKIjopDAXSwArfO6fQKTpjLhCi3COIA169WGRR4CKCwNzzpFAYP2ilNc18D_HRTBLS6UjxZSNUtWE5dbx7uBjblhwIwn5e1fxiEQcknVK8Dxf8NUliFECvr02HX2hNvmuCECkvA_mZYlshAeqidK8tSEXirAWsWS5jlXFqLiBJkhSHFrbxRyqeOSfJCJR_YcCwk9AzgZGg",
    "X-Id-Token": "eyJhdF9oYXNoIjoiRl8tRjZaUVgtWVRDNEh0TldmcHJmUSIsImJpcnRoZGF0ZSI6bnVsbCwiZmFtaWx5X25hbWUiOm51bGwsImdlbmRlciI6IlUiLCJnaXZlbl9uYW1lIjpudWxsLCJpc3MiOiJodHRwczpcL1wvYXBpc2l4LmF1dGhpbmcuY25cL29pZGMiLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oiLCJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwiaWF0IjoxNjQwNTk4ODU4LCJuaWNrbmFtZSI6bnVsbCwibm9uY2UiOiJmMTlmZjhjODM5NzdmZjNlMDczMzZmMzg3Y2QxM2EzMSIsIm1pZGRsZV9uYW1lIjpudWxsLCJleHAiOjE2NDE4MDg0NTgsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYXVkIjoiNjFjOTgzYzRiMjg3N2Q0ODY5ZGQ4YWNiIiwicHJvZmlsZSI6bnVsbH0=",
    "X-Userinfo": "eyJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwicHJvZmlsZSI6bnVsbCwibmlja25hbWUiOm51bGwsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYmlydGhkYXRlIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZ2VuZGVyIjoiVSIsImdpdmVuX25hbWUiOm51bGwsIm1pZGRsZV9uYW1lIjpudWxsLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oifQ=="
    ...
    

    X-Access-Token: Apache APISIX는 사용자 제공자로부터 얻은 액세스 토큰을 X-Access-Token 요청 헤더에 포함하며, 플러그인 구성에서 access_token_in_authorization_header를 통해 Authorization 요청 헤더에 포함할지 여부를 선택할 수 있습니다.

    X-Access-Token

    X-Id-Token: Apache APISIX는 사용자 제공자로부터 얻은 ID 토큰을 base64 인코딩 후 X-Id-Token 요청 헤더에 포함하며, 플러그인 구성에서 set_id_token_header를 통해 이 기능을 활성화 또는 비활성화할 수 있습니다.

    X-Id-Token

    X-Userinfo: Apache APISIX는 사용자 제공자로부터 얻은 사용자 정보를 base64 인코딩 후 X-Userinfo에 포함합니다. 플러그인 구성에서 set_userinfo_header를 통해 이 기능을 활성화 또는 비활성화할 수 있습니다.

    X-Userinfo

    보시다시피, Apache APISIX는 X-Access-Token, X-Id-Token, X-Userinfo 요청 헤더를 업스트림으로 전달합니다. 업스트림은 이러한 헤더를 파싱하여 사용자 ID 정보와 사용자 메타데이터를 얻을 수 있습니다.

  4. Authing 콘솔의 "감사 로그 - 사용자 행동 로그"에서 user1의 로그인 정보를 확인할 수 있습니다. 로그인 정보

요약

이 문서는 Apache APISIX와 Authing을 연동하는 상세한 단계를 설명합니다.

Apache APISIX는 자체의 고성능을 유지하는 데에만 전념하는 것이 아니라, 오픈 소스 생태계 구축에도 항상 큰 중요성을 두고 있습니다. 현재 Apache APISIX는 10개 이상의 인증 및 권한 부여 관련 플러그인을 지원하며, 업계의 주요 인증 및 권한 부여 서비스와의 연동을 지원합니다.

다른 인증 기관과의 연동이 필요한 경우, Apache APISIX의 GitHub를 방문하여 issue를 통해 제안을 남기거나, Apache APISIX의 메일링 리스트를 구독하여 이메일로 의견을 표현할 수 있습니다.

Tags: