Apache APISIX OpenID Connect 플러그인을 사용한 중앙 집중식 ID 인증
API7.ai
September 7, 2021
Apache APISIX OpenID Connect 플러그인을 사용하여 Okta 인증을 구성하는 것은 간단한 세 단계 과정입니다. 이를 통해 전통적인 인증 모드에서 중앙 집중식 신원 인증 모드로 전환할 수 있습니다. 다음 섹션에서는 Apache APISIX용 OpenID Connect 플러그인을 사용하여 Okta 인증을 구성하는 단계를 설명합니다.
중앙 집중식 신원 인증 모드는 전통적인 인증 모드와 비교하여 다음과 같은 장점이 있습니다:
- 중앙 집중식 신원 인증은 애플리케이션 개발 과정을 단순화합니다.
- 중앙 집중식 신원 인증은 비즈니스 보안을 향상시킵니다.
전제 조건
사용할 준비가 된 Okta 계정이 있어야 합니다.
1단계: Okta 구성
- Okta 계정에 로그인하고 "Create App Integration"을 클릭하여 Okta 애플리케이션을 생성합니다.
- Sign-in method로 "OIDC- OpenID Connect"를 선택하고, Application type으로 "Web Application"을 선택합니다.
- 로그인 및 로그아웃을 위한 리디렉션 URL을 설정합니다. "Sign-in redirect URIs"는 로그인 성공 후 리디렉션될 수 있는 링크이고, "Sign-out redirect URIs"는 로그아웃 후 리디렉션될 링크입니다. 이 예제에서는 로그인 리디렉션 및 로그아웃 리디렉션 URI를 모두 http://127.0.0.1:9080/로 설정합니다.
- 설정을 완료한 후 "Save"를 클릭하여 변경 사항을 저장합니다.
- 애플리케이션의 General 페이지를 방문하여 다음 구성을 얻습니다. 이 구성은 Apache APISIX OpenID Connect를 구성하는 데 필요합니다.
- Client ID: 애플리케이션 ID로, 아래의 client_id에 해당합니다.
- Client secret: 애플리케이션 키로, 아래의 client_secret에 해당합니다.
- Okta domain: 애플리케이션이 사용하는 도메인 이름으로, 아래의 {ISSUER}에 해당합니다.
2단계: Apache APISIX 설치
의존성 설치
Apache APISIX 런타임 환경은 NGINX와 etcd에 의존합니다. Apache APISIX를 설치하기 전에 사용 중인 운영 체제에 따라 의존성을 설치하십시오. CentOS7, Fedora 31 & 32, Ubuntu 16.04 & 18.04, Debian 9 & 10, 그리고 MacOS에 대한 의존성 설치 지침을 제공합니다. 자세한 내용은 Install Dependencies를 참조하십시오.
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를 통한 설치
참조: Installing Apache APISIX with Docker.
Helm Chart를 통한 설치
참조: Installing Apache APISIX with Helm Chart.
소스 릴리스를 통한 설치
-
apisix-2.7
이라는 디렉토리를 생성합니다.mkdir apisix-2.7
-
Apache APISIX Release 소스 패키지를 다운로드합니다.
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz
Apache APISIX 웹사이트에서도 Apache APISIX Release 소스 패키지를 다운로드할 수 있습니다. Apache APISIX Official Website - Download Page에서도 Apache APISIX, APISIX Dashboard 및 APISIX Ingress Controller의 소스 패키지를 제공합니다.
-
Apache APISIX Release 소스 패키지를 압축 해제합니다.
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
-
런타임에 필요한 Lua 라이브러리를 설치합니다.
# apisix-2.7 디렉토리로 이동 cd apisix-2.7 # 의존성 생성 make deps
의존성 초기화
다음 명령을 실행하여 NGINX 구성 파일과 etcd를 초기화합니다.
# NGINX 구성 파일과 etcd 초기화
make init
3단계: Apache APISIX 시작 및 해당 경로 구성
-
다음 명령을 실행하여 Apache APISIX를 시작합니다.
apisix start
-
경로를 생성하고 OpenID Connect 플러그인을 구성합니다. 다음 코드 예제는 Apache APISIX Admin API를 통해 경로를 생성하며, 업스트림 경로를 httpbin.org로 설정합니다. httpbin.org는 요청을 받고 응답하는 간단한 백엔드 서비스입니다. 다음은 httpbin.org의 get 페이지를 사용합니다. 자세한 내용은 http bin get을 참조하십시오. 특정 구성 항목은 Apache APISIX OpenID Connect Plugin을 참조하십시오.
OpenID Connect 구성 필드는 다음과 같습니다:
필드 | 기본값 | 설명 |
---|---|---|
client_id | "" | OAuth 클라이언트 ID. |
client_secret | "" | OAuth 클라이언트 시크릿. |
discovery | "" | 신원 제공자의 서비스 디스커버리 엔드포인트. |
scope | openid | 접근할 리소스의 범위. |
relm | apisix | WWW-Authenticate 응답 헤더 인증 정보를 지정합니다. |
bearer_only | false | 요청 헤더의 토큰을 확인할지 여부. |
logout_path | /logout | 로그아웃 URI. |
redirect_uri | request_uri | 신원 제공자가 리디렉션할 URI로, 기본값은 요청 주소입니다. |
timeout | 3 | 요청 시간 초과 시간, 단위는 초입니다. |
ssl_verify | false | 신원 제공자의 SSL 인증서를 확인합니다. |
introspection_endpoint | "" | 신원 제공자의 토큰 인증 엔드포인트 URL로, 비어 있으면 discovery에서 추출됩니다. |
introspection_endpoint_auth_method | client_secret_basic | 토큰 인트로스펙션을 위한 인증 방법 이름. |
public_key | "" | 인증 토큰을 위한 공개 키. |
token_signing_alg_values_expected | "" | 인증 토큰을 위한 알고리즘. |
set_access_token_header | true | 요청 헤더에 액세스 토큰을 포함할지 여부. |
access_token_in_authorization_header | false | 액세스 토큰을 Authorization 헤더에 넣을지 여부. 이 값이 true로 설정되면 액세스 토큰이 Authorization 헤더에, false로 설정되면 X-Access-Token 헤더에 배치됩니다. |
set_id_token_header | true | X-ID-Token 요청 헤더에 ID 토큰을 포함할지 여부. |
set_userinfo_header | true | X-Userinfo 요청 헤더에 사용자 정보를 포함할지 여부. |
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_ISSUER}/.well-known/openid-configuration",
"scope":"openid profile",
"bearer_only":false,
"realm":"master",
"introspection_endpoint_auth_method":"client_secret_post",
"redirect_uri":"http://127.0.0.1:9080/"
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"httpbin.org:80":1
}
}
}'
검증
-
"http://127.0.0.1:9080/get"을 방문하면 OpenID Connect 플러그인이 활성화되어 있기 때문에 페이지가 Okta 로그인 페이지로 리디렉션됩니다.
-
사용자의 Okta 계정의 사용자 이름과 비밀번호를 입력하고 "Sign In"을 클릭하여 Okta 계정에 로그인합니다.
-
로그인에 성공하면 "httpbin.org"의 get 페이지에 접근할 수 있습니다. "httpbin.org/get" 페이지는 요청된 데이터를 X-Access-Token, X-Id-Token, X-Userinfo와 함께 반환합니다.
"X-Access-Token": "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9rdGEuY29tIiwic3ViIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImlhdCI6MTYyODEyNjIyNSwiZXhwIjoxNjI4MTI5ODI1LCJjaWQiOiIwb2ExMWc4ZDg3TzBGQ0dYZzY5NiIsInVpZCI6IjAwdWEwNWVjZEZmV0tMS3VvNjk1Iiwic2NwIjpbIm9wZW5pZCIsInByb2Zpb***.****iBshIcJhy8QNvzAFD0fV4gh7OAdTXFMu5k0hk0JeIU6Tfg_Mh-josfap38nxRN5hSWAvWSk8VNxokWTf1qlaRbypJrKI4ntadl1PrvG-HgUSFD0JpyqSQcv10TzVeSgBfOVD-czprG2Azhck-SvcjCNDV-qc3P9KoPQz0SRFX0wuAHWUbj1FRBq79YnoJfjkJKUHz3uu7qpTK89mxco8iyuIwB8fAxPMoXjIuU6-6Bw8kfZ4S2FFg3GeFtN-vE9bE5vFbP-JFQuwFLZNgqI0XO2S7l7Moa4mWm51r2fmV7p7rdpoNXYNerXOeZIYysQwe2_L****", "X-Id-Token": "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyODEyOTgyNSwiaWRwIjoiMDBvYTA1OTFndHAzMDhFbm02OTUiLCJub25jZSI6ImY3MjhkZDMxMWRjNGY3MTI4YzlmNjViOGYzYjJkMDgyIiwiaWF0IjoxNjI4MTI2MjI1LCJhdXRoX3RpbWUi*****", "X-Userinfo": "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"
X-Access-Token: Apache APISIX는 사용자 제공자로부터 얻은 액세스 토큰을 X-Access-Token 요청 헤더에 넣습니다. 플러그인 구성에서 access_token_in_authorization_header를 통해 선택적으로 Authorization 요청 헤더에 넣을 수 있습니다.
X-Id-Token: Apache APISIX는 사용자 제공자로부터 Id 토큰을 얻어 Base64 인코딩을 통해 X-Id-Token 요청 헤더에 넣습니다. 플러그인 구성에서 set_id_token_header를 통해 이 기능을 활성화할지 여부를 선택할 수 있으며, 기본적으로 활성화되어 있습니다.
X-Userinfo: Apache APISIX는 사용자 제공자로부터 사용자 정보를 얻어 Base64 인코딩을 통해 X-Userinfo에 넣습니다. 플러그인 구성에서 set_userinfo_header를 통해 이 기능을 활성화할지 여부를 선택할 수 있으며, 기본적으로 활성화되어 있습니다.
보시다시피, Apache APISIX는 X-Access-Token, X-Id-Token, X-Userinfo 요청 헤더를 업스트림으로 전달합니다. 업스트림은 이러한 헤더를 파싱하여 사용자 ID 정보와 사용자 메타데이터를 얻을 수 있습니다.
우리는 Okta에서 직접 Apache APISIX Gateway로 중앙 집중식 신원 인증을 구축하는 과정을 보여주었습니다. 무료 Okta 개발자 계정을 등록하여 시작하는 것은 쉽습니다. 우리의 접근 방식은 개발자 오버헤드를 줄이고 안전하고 간소화된 경험을 가능하게 합니다.
Okta 정보
Okta는 애플리케이션에 인증 및 권한 부여 서비스를 추가하기 위한 맞춤형, 안전한, 즉시 사용 가능한 솔루션입니다. 개발 오버헤드, 보안 위험, 그리고 직접 코딩해야 하는 유지보수 없이 애플리케이션에 바로 내장된 확장 가능한 인증을 제공합니다. 어떤 언어나 스택의 애플리케이션이든 Okta에 연결하고 사용자가 로그인하는 방식을 정의할 수 있습니다. 사용자가 인증을 시도할 때마다 Okta는 그들의 신원을 확인하고 필요한 정보를 애플리케이션으로 다시 보냅니다.
Apache APISIX 정보
Apache APISIX는 동적, 실시간, 고성능 API 게이트웨이입니다. Apache APISIX는 로드 밸런싱, 동적 업스트림, 카나리 릴리스, 서킷 브레이커, 인증, 관찰 가능성 등 다양한 트래픽 관리 기능을 제공합니다. Apache APISIX를 사용하여 전통적인 남북 트래픽뿐만 아니라 서비스 간의 동서 트래픽도 처리할 수 있습니다. 또한 k8s ingress 컨트롤러로 사용할 수도 있습니다.
전 세계 수백 개의 회사가 Apache APISIX를 사용하고 있으며, 금융, 인터넷, 제조, 소매, 통신사 등 다양한 산업에서 사용됩니다. NASA, 유럽 연합의 디지털 팩토리, TravelSky, Tencent, Huawei, Weibo, China Mobile, Taikang, 360 등이 그 예입니다.
Github: https://github.com/apache/apisix
Website: https://apisix.apache.org