Forward-Auth, 인증 기능을 위한 또 다른 선택
API7.ai
January 26, 2022
Forward Auth는 인증 및 권한 부여 로직을 전용 외부 서비스로 스마트하게 이동시킵니다. 이때 게이트웨이는 사용자의 요청을 인증 서비스로 전달하고, 인증 서비스가 20x가 아닌 상태로 응답할 경우 원래 요청을 차단하고 결과를 대체합니다. 이를 통해 인증이 실패할 경우 사용자 정의 오류를 반환하거나 사용자를 인증 페이지로 리디렉션할 수 있습니다.
원리
Apache APISIX의 forward-auth 플러그인
의 원리와 흐름은 위 그림과 같으며, 다음과 같은 단계로 요약할 수 있습니다.
- 1단계: 클라이언트가 APISIX에 요청을 보냅니다.
- 2단계: APISIX가 사용자가 구성한 인증 서비스에 요청을 보냅니다.
- 3단계: 인증 서비스가 응답합니다 (2xx 또는 예외 상태).
- 4단계: 인증 서비스의 응답에 따라 APISIX는 요청을 업스트림으로 전달하거나 클라이언트에 직접 거부 응답을 보냅니다.
사용 방법
1단계: 인증 서비스 설정
사용자가 Authorization 요청 헤더와 함께 요청을 보내는 인증 서비스가 있다고 가정합니다. 이 데이터가 인증을 통과하면 200 상태 코드와 X-User-ID
라는 응답 헤더를 반환하고, 인증을 통과하지 못하면 인증 상태가 만료된 것으로 간주하여 302 상태 코드와 Location
응답 헤더를 반환하여 클라이언트를 로그인 페이지로 리디렉션합니다.
2단계: 라우트 생성 및 forward-auth
플러그인 활성화
다음으로, 라우트를 구성하고 forward-auth
플러그인을 활성화하여 위의 인증 서비스를 업스트림 애플리케이션과 인터페이스합니다.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"forward-auth": {
"address": "http://127.0.0.1:9080/auth",
"request_headers": ["Authorization"],
"upstream_headers": ["X-User-ID"],
"client_headers": ["Location"]
}
},
"uri": "/user"
}'
위 구성의 세부 사항은 다음과 같습니다.
- 요청이 현재 라우트와 일치할 때,
address
에 정의된 주소로 요청을 보내며,request_headers
에 정의된 Authorization 요청 헤더를 포함합니다 (즉, 클라이언트가 인증 서비스로 전달하도록 구성된 요청 헤더, 설정되지 않은 경우 요청 헤더를 전달하지 않음). 이를 통해 인증 서비스는 사용자의 신원을 확인할 수 있습니다. - 인증이 통과되면 상태 코드 200과
upstream_headers
에 정의된X-User-ID
를 반환합니다 (즉, 인증이 통과될 때 인증 서비스가 업스트림으로 전달할 요청 헤더, 설정되지 않은 경우 요청 헤더를 전달하지 않음). - 인증이 실패하면 상태 코드 302와
client_headers
에 정의된Location
을 반환합니다 (즉, 인증이 실패할 때 인증 서비스가 클라이언트에게 보낼 응답 헤더, 설정되지 않은 경우 응답 헤더를 보내지 않음).
3단계: 요청 테스트
# POST를 사용하여 요청 및 데이터 전송
curl http://127.0.0.1:9080/user \
--header 'Authorization: true'
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 28
Server: APISIX/2.11.0
{"user_id":"i-am-real-user"}
# GET을 사용하여 요청
curl -i http://127.0.0.1:9080/user \
--header 'Authorization: false'
HTTP/1.1 302 FOUND
Server: APISIX/2.11.0
Location: https://example.com/auth
부록: 플러그인 비활성화
Forward Auth 플러그인 사용을 마친 후에는 라우트 구성에서 forward-auth
플러그인 구성을 제거하고 저장하여 라우트에서 Forward Auth 플러그인을 끌 수 있습니다.
Apache APISIX의 동적 특성 덕분에 플러그인을 켜고 끄기 위해 Apache APISIX를 재시작할 필요가 없습니다.
요약
forward-auth
플러그인에 대한 더 많은 정보와 전체 구성 목록을 보려면 공식 문서를 참조하십시오. 또한, 더 복잡한 인증 또는 권한 부여 시나리오가 있다면 opa
플러그인을 사용해 보십시오. 이 플러그인은 프로그래밍 방식으로 더 강력한 기능을 제공합니다.
Apache APISIX는 현재 추가 서비스 통합을 지원하기 위해 더 많은 플러그인을 개발 중입니다. 관심이 있다면 GitHub Discussion에서 논의를 시작하거나 메일링 리스트를 통해 소통할 수 있습니다.