OpenSource/Keycloak

[OpenSource] Keycloak 이해하기 -2 : SAML/OIDC 프로토콜, 인증 흐름(Authentication flow) 종류

adjh54 2025. 1. 27. 00:16
728x170
해당 글에서는 SAML/OIDC 통신 프로토콜에 대해 이해하고 OIDC 인증 흐름의 종류에 대해서 알아봅니다.



 
 
 

💡 [참고] Keycloak 초기 구성에서부터 활용 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 주제 URL
Docker Docker Compose를 이용한 Keycloak 환경 구성 및 실행 방법 https://adjh54.tistory.com/644
환경설정 Google Cloud Console OAuth 2.0 API 액세스 환경 설정하기 https://adjh54.tistory.com/657
     
이해하기 Keycloak 이해하기 -1 : 구성 요소, 인증 처리과정, 주요 기능 https://adjh54.tistory.com/645
이해하기 Keycloak 이해하기 -2 : SAML/OIDC 프로토콜, 인증 흐름(Authentication flow) 종류 https://adjh54.tistory.com/646
이해하기 Keycloak 이해하기 -3 : 기본 환경 구성 및 로그인/로그아웃 구현 https://adjh54.tistory.com/647
이해하기 Keycloak 이해하기 -4 : Keycloak 권한 및 종류 https://adjh54.tistory.com/655
     
구성하기 Spring Boot 환경에서 Keycloak 활용하기 -1 : OIDC 인증 흐름 구현(Standard Flow) https://adjh54.tistory.com/648
구성하기 Spring Boot 환경에서 Keycloak 활용하기 -2 : OIDC 인증 흐름 구현(Direct Access Grants, Implicit Flow) https://adjh54.tistory.com/649
구성하기 Spring Boot 환경에서 Keycloak 활용하기 -3 : OIDC 인증 흐름 구현(Service Accounts Roles) https://adjh54.tistory.com/654
구성하기 Spring Boot 환경에서 Keycloak 활용하기 -4 : Identity providers Social 소셜 로그인 구현(Google) https://adjh54.tistory.com/658
     
Github Spring Boot Keycloak 관련 Repository https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-keycloakhttps://github.com/adjh54ir/blog-codes/tree/main/spring-boot-keycloak-sub

 

 

1) Keycloak


💡 Keycloak

- Red Hat에서 개발한 오픈소스 Identity and Access Management(IAM) 솔루션입니다. 현대적인 애플리케이션과 서비스를 위한 인증 및 권한 부여 기능을 제공하는 인증 서버(Authentication Server)의 기능을 수행합니다.

- Keycloack에서는 여러 플랫폼에서 중앙 집중식 인증 서버로 동작을 합니다. 주요한 기능은 서로 다른 도메인에서 실행되는 애플리케이션 간의 SSO를 지원하거나 REST API 기반에 접근제어 토큰에 대한 인증 제공 및 세션 타임아웃, 동시 로그인 제한과 같은 다양한 세션 기능을 담당합니다.

 

Keycloak

Single-Sign On Users authenticate with Keycloak rather than individual applications. This means that your applications don't have to deal with login forms, authenticating users, and storing users. Once logged-in to Keycloak, users don't have to login again

www.keycloak.org

 
 

2) 인증 프로토콜 -1 : SAML(Security Assertion Markup Language) Protocol


💡 인증 프로토콜 -1 : SAML(Security Assertion Markup Language) Protocol

- XML 기반의 개방형 표준 데이터 포맷으로 사용자의 인증 및 인가 데이터를 교환하기 위한 프로토콜입니다.
- 주로 기업환경에서 SSO(Single Sign-On)를 구현하는 데 사용되며, 특히 엔터프라이즈 애플리케이션에서 널리 사용됩니다.
구성 요소 설명 간단 설명
Identity Provider(IdP) - 사용자의 신원을 확인하고 인증을 수행하는 서비스를 의미합니다.
- 인증된 사용자의 정보를 SAML Assertions 형태로 SP에게 전달합니다.
- 로그인을 수행하는 시스템 또는 애플리케이션
Service Provider(SP) - 인증이 완료된 사용자가 이용하는 애플리케이션이나 시스템을 의미합니다.
- 인증된 사용자 정보를 받아서 처리하는 주체를 의미합니다.
- 사용자가 최초 접근하는 곳이자 접근 시 IdP로 리다이렉션하여 로그인을 요청하는 시스템 또는 애플리케이션
- Idp에서 로그인 인증 후 접근 권한을 부여받는 시스템
SAML Metadata - IdP와 SP 간의 신뢰 관계 설정과 통신에 필요한 정보를 담고 있습니다. - Idp와 SP간에 최초 연결 시, 필요 정보 교환
SAML Assertions - IdP가 SP에게 전달을 하는 XML 형식의 보안 토큰으로 사용자 인증 상태, 속성 정보, 권한 등의 정보를 포함합니다. - Idp가 SP에게 전달하는 XML 형식의 보안 토큰

 

 

 

💡 아래의 예시에서는 Keycloak과 SSO 연동시스템 (AWS IAM) 간의 관계를 통해서 이해를 해봅니다. 💡 

 

1. Keycloak이 신원 제공자(Idp, Identity Provider) 역할을 수행하는 경우


💡 Keycloak이 신원 제공자(Idp, Identity Provider) 역할을 수행하는 경우

- 최초 사용자는 AWS IAM 페이지에 접근하면 Keycloak으로 리다이렉션이 됩니다.
리다이렉션 된 Keycloak 로그인 페이지에서 자격증명(아이디/패스워드)를 통해 ‘인증’을 수행하면 AWS IAM으로부터 리소스 접근에 대한 ‘인가’를 부여받아서 AWS 서비스를 이용할 수 있는 경우입니다.

구성 요소 주체 간단 설명
Identity Provider(IdP) Keycloak - 로그인을 수행하는 시스템 또는 애플리케이션
Service Provider(SP) SSO 연동 시스템(AWS IAM) - 사용자가 최초 접근하는 곳이자 접근 시 IdP로 리다이렉션하여 로그인을 요청하는 시스템 또는 애플리케이션
- Idp에서 로그인 인증 후 접근 권한을 부여받는 시스템
SAML Metadata   - Idp와 SP간에 최초 연결 시, 필요 정보 교환
SAML Assertions   • Idp가 SP에게 전달하는 XML 형식의 보안 토큰

 

💡 Keycloak이 신원 제공자(Idp, Identity Provider) 역할을 수행할 때 처리과정

1. 서비스 접근 요청
- 사용자는 ‘SSO 연동 시스템 : SP, Service Provider’의 보호된 리소스에 접근을 시도합니다.
- 서비스 제공자(SP, Service Provider)는 사용자를 ‘Keycloak 로그인 페이지: IdP, Identity Provider’로 리다이렉트 합니다.

2. 사용자 인증
- Keycloak은 사용자에게 로그인 페이지를 제공합니다.
- 사용자는 자격증명(아이디/비밀번호)을 입력하여 인증을 수행합니다

3. SAML Assertion 생성
- 인증이 성공하면 Keycloak은 사용자 정보를 포함한 SAML Assertion을 생성합니다
- 디지털 서명을 통해 Assertion의 무결성을 보장합니다

4. SP로 응답 전송
- Keycloak은 생성된 SAML Assertion을 SSO 연동 시스템에게 전달합니다.
- 사용자는 SSO 연동 시스템으로 리다이렉트 되어 서비스를 이용할 수 있게 됩니다

https://blog.logto.io/ko/saml-app-integration

 

 

2. Keycloak 서비스 제공자(SP, Service Provider) 역할을 수행하는 경우


💡 Keycloak 서비스 제공자(SP, Service Provider) 역할을 수행하는 경우

- 해당 경우는 사용자는 ‘Keycloak : SP, Service Provider’으로 접근을 시도하면, 해당 Keycloak에서는 ‘외부 SSO 시스템:IdP, Identity Provider’ 로그인 페이지로 리다이렉션 합니다.

- ‘외부 SSO 시스템 로그인 페이지’에서 로그인을 수행하여 ‘인증’을 수행하고 완료가 되면, SSO 연동 서비스는 SAML Assertion을 생성하여 서비스 제공자(SP, Service Provider)로 전송합니다.
- Keycloak에서는 SAML Assertion을 검증한 후 사용자에게 접근 권한을 부여합니다.

 

구성 요소 주체 간단 설명
Identity Provider(IdP) SSO 연동 시스템(AWS IAM) - 로그인을 수행하는 시스템 또는 애플리케이션
Service Provider(SP) Keycloak - 사용자가 최초 접근하는 곳이자 접근 시 IdP로 리다이렉션하여 로그인을 요청하는 시스템 또는 애플리케이션
- Idp에서 로그인 인증 후 접근 권한을 부여받는 시스템
     
SAML Metadata   - Idp와 SP간에 최초 연결 시, 필요 정보 교환
SAML Assertions   - Idp가 SP에게 전달하는 XML 형식의 보안 토큰

 

💡 Keycloak 서비스 제공자(SP, Service Provider) 역할을 수행 처리과정

1. 사용자가 SP에 접근 시도
- 사용자가 보호된 리소스에 접근을 시도합니다
- SP는 사용자가 인증되지 않은 것을 확인합니다

2. IdP로 인증 요청

- SP는 SAML 인증 요청을 생성합니다
- 사용자를 IdP의 로그인 페이지로 리다이렉트 합니다

3. IdP에서 인증 수행
- 사용자는 IdP에서 자격증명을 제공하여 인증합니다
- IdP는 인증 성공 시 SAML Assertion을 생성합니다

4. SP로 응답 처리
- IdP는 사용자를 SP로 다시 리다이렉트 하며 SAML Assertion을 전달합니다
- SP는 받은 SAML Assertion을 검증하고 사용자 세션을 생성합니다

5. 서비스 접근 허용

- 검증이 성공하면 SP는 사용자에게 요청한 리소스에 대한 접근을 허용합니다

https://blog.logto.io/ko/saml-app-integration

 

 

3. SAML 처리 상세 과정 -1 : SAML 메타데이터 교환


💡 SAML 처리 상세 과정 -1 : SAML 메타데이터 교환

- SAML 2.0 프로토콜을 통한 안전한 인증 정보 교환 설정하며 Keycloak과 AWS 간의 신뢰 관계 구축을 위한 기초 설정을 합니다.

 

3.1. SSO 시스템 → Keycloak SAML 메타데이터 교환


💡 SSO 시스템 → Keycloak SAML 메타데이터 교환

- SSO 시스템(AWS)에서 메타데이터를 다운로드를 합니다.
curl -O https://signin.aws.amazon.com/static/saml-metadata.xml

 

💡 SSO 시스템(AWS)에서 다운로드한 saml-metadata.xml 파일을 클라이언트에 주입합니다.

 

3.2. Keycloak → SSO 시스템 SAML 메타데이터 교환


💡 Keycloak → SSO 시스템 SAML 메타데이터 교환

- Keycloak에서 메타데이터를 다운로드합니다.

 

 

3.2. Keycloak → SSO 시스템 SAML 메타데이터 교환


💡 Keycloak → SSO 시스템 SAML 메타데이터 교환

- Keycloak에서 메타데이터를 다운로드합니다.

 

💡 Keycloak에서 다운로드한 saml-metadata.xml 파일을 클라이언트에 주입합니다.

 

4. SAML 처리 상세 과정 -2  : Keycloak 로그인 수행(IdP)


💡 SAML 처리 상세 과정 -2 : Keycloak 로그인 수행(IdP)

- 사용자에게 Keycloak 로그인 페이지를 출력하며, 자격증명(아이디/패스워드)을 입력하는 '인증'을 요청합니다.

 

 

5. SAML 처리 상세 과정 -3: SAML Assertions 파일로 교환 (Idp → SP)


💡 SAML 처리 상세 과정 -3: SAML Assertions 파일로 교환(Idp → SP)

- 인증이 성공하는 경우 Keyclaok에서는 아래와 같은 SAML Aseertion을 생성하고 이를 SP에게 전달합니다.

 

 

6. SAML 처리 상세 과정 -4: AWS 리다이렉트(SP)


💡 SAML 처리 상세 과정 -4: AWS 리다이렉트(SP)

- SP에서는 전달받은 SAML Assertion을 검증하고 이를 통과한 경우 ‘인가’하여 서비스를 이용할 수 있도록 합니다.

 

 

3) 인증 프로토콜 -2 : OIDC(OpenID Connect) Protocol


 

💡 인증 프로토콜 -2 : OIDC(OpenID Connect) Protocol

- OAuth 2.0 프로토콜을 확장하여 만든 사용자 인증을 위한 표준화된 인증(Authentication) 프로토콜입니다.

- 기존 OAuth 2.0은 인가(Authorization)에 중점을 두고 있어 사용자 인증에 대한 표준이 부족했습니다. 이러한 한계를 해결하기 위해 OIDC에서는 OAuth 2.0 위에 '표준화된 인증 계층'을 추가한 프로토콜입니다.

https://www.ala.org.au/blogs-news/elevating-alas-data-security-with-openid-connect/

주요 특징 설명
표준화된 프로토콜 OAuth 2.0을 기반으로 하여 표준화된 인증 방식을 제공합니다.
ID 토큰 발급 JWT 형식의 ID 토큰을 통해 사용자 신원 정보를 안전하게 전달합니다.
사용자 정보 엔드포인트 표준화된 방식으로 사용자 정보에 접근할 수 있는 엔드포인트를 제공합니다.
SSO 지원 단일 로그인으로 여러 서비스에 접근할 수 있는 SSO 기능을 제공합니다.
보안성 토큰 기반의 안전한 인증 메커니즘을 제공하여 보안을 강화합니다.

 
 

[더 알아보기]

💡 인증(Authentication), 인가(Authorization)

- 인증(Authentication)은 자격증명을 통해서 사용자가 자신이 주장하는 신원이 맞는지 확인하는 과정을 의미합니다.
- 즉, “당신이 누구인지”에 대해 확인하는 절차를 의미합니다.

- 인가(Authorization)는 인증과정을 통해 인증된 사용자에게 권한을 부여하는 과정을 의미합니다.
- 즉, 리소스에 접근하여 “무엇을 할 수 있는지”에 대해 권한을 부여하는 절차를 의미합니다.


💡 OAuth 2.0 내에는 인증기능이 없는가?

- 아래의 이미지는 OAuth2.0의 인증 프로세스입니다.
- 아래의 프로세스를 확인해 보면, 사용자는 애플리케이션을 통해 로그인을 수행하여 자격증명(아이디/비밀번호)을 통해서 “내가 누구인지”에 대한 인증을 수행합니다.
- 이러한 인증 과정을 통해서, 최종적으로 Access Token을 발급받아서, 리소스에 대한 접근 권한을 부여받는 인가 과정이 수행이 됩니다.
- 이렇듯, OAuth2.0에서는 인증과 인가를 수행하지만 “인가”자체에만 초점을 맞추고 있고, 인증 방식에 대한 명확한 표준 방법이 정의되지 않았습니다.
- 그렇기에 인증 과정의 표준화된 방법이 필요하게 되었고, 이를 해결하기 위해 OIDC가 등장하게 되었습니다.

 

💡 [참고] OAuth2.0에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java] Spring Boot 3.x Security + OAuth 2.0 Client 이해하고 적용하기 -1 : 초기 환경 구성 및 카카오, 네이버

해당 글에서는 Spring Boot 3.x 기반 개발 환경에서 Security + OAuth 2.0을 활용하여 초기 환경을 설정하고 외부 로그인을 통해 사용자 정보를 조회하는 과정에 대해 알아봅니다.  💡 [참고] Spring Boot Sec

adjh54.tistory.com

 
 

4) OIDC 인증 흐름(Authentication flow)


💡 OIDC 인증 흐름(Authentication flow)

- OIDC(OpenID Connect) 인증 프로토콜을 이용하여 구현하는 구체적인 인증 방법들을 의미합니다. 즉, 애플리케이션(Client)을 기준으로 OIDC 프로토콜을 통해서 Keycloak과 통신하고 인증하는 방법들을 의미합니다.
- 이러한 OIDC 인증 흐름은 한 가지 방법으로 인증 과정을 수행할 수 있고, 여러 가지 다양한 방법으로 인증과정을 구현할 수 있습니다.

 

1. 주요 특징


주요 특징 설명
유연한 구성 다양한 인증 방식을 조합하여 커스텀 인증 흐름을 만들 수 있습니다.
다중 인증 여러 단계의 인증을 순차적으로 적용할 수 있습니다.
조건부 실행 특정 조건에 따라 다른 인증 단계를 실행할 수 있습니다.

 

[ 더 알아보기 ]

💡 그러면 keycloak에서 설정한 flow를 통해서 단일 인증 외에 다중 인증으로 처리가 가능하다는 걸까?

- Keycloak의 Authentication Flow 설정을 통해 다중 인증 구성이 가능합니다.
- 예를 들어서, 자격증명(아이디/비밀번호)을 통해서 로그인 사용자의 인증을 수행하고 다음 단계로 OTP(One-Time Password) 인증을 수행할 수 있습니다.
- 이러한 과정을 통해서 인증 단계를 순차적으로 실행이 가능하고, 필수/선택적 인증 단계 설정이 가능합니다.

 
 
 

5) 인증 흐름(Authentication flow) 종류


인증 흐름 종류 설명 사용처
Standard Flow - OAuth 2.0의 Authorization Code Flow 기반으로 인증을 수행하며, 사용자는 Keycloak 로그인 페이지로 리다이렉트 되어서 인증을 수행하는 인증방식을 의미합니다. 웹 애플리케이션
Direct Access Grants - 직접 REST API를 통해 자격 증명(아이디/비밀번호)을 담아서 통신하며 별도의 리다이렉션 없이 즉시 토큰을 받을 수 있는 인증방식을 의미합니다. 신뢰할 수 있는 애플리케이션(모바일 애플리케이션, 백엔드 시스템에서 직접 인증이 필요한 경우)
Implicit Flow - 간소화된 인증흐름으로 인가 코드(Auth Code) 없이 직접 액세스 토큰을 받아서 인증을 수행하는 방식을 의미합니다. 모바일 앱, 단일 페이지 애플리케이션(SPA)
Service Accounts Roles - 애플리케이션 시스템 간에 인증 기반의 통신을 위한 방법으로, 클라이언트 자체적으로 API를 호출하여 다른 서비스와의 통신을 할 때 사용하는 인증방식입니다. 마이크로서비스 간 통신(서버-서버간 통신), 자동화된 프로세스
OAuth 2.0 Device Authorization Grant - 스마트 TV나 IoT 기기와 같이 제한된 입력 기능을 가진 디바이스를 위한 인증 방식입니다. 스마트 TV 애플리케이션, IoT 디바이스, 게임 콘솔, 프린터 및 스캐너
OIDC CIBA Grant - 클라이언트가 사용자의 직접적인 상호작용 없이 인증을 시작하는 인증 방식입니다.
- 사용자가 인증을 요청한 디바이스와 실제 인증을 수행하는 디바이스가 물리적으로 분리된 방식입니다.
금융 서비스, 공유 디바이스, 스마트홈 시스템

 

💡 [참고] Keycloak내에 Client를 설정할 때, OIDC를 선택한 경우 인증 흐름(Authentication flow)을 선택하여 인증 방식을 지정합니다.

 
 

💡 [참고] OAuth 2.0의 인증방식에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java] Spring Boot OAuth 2 Client 이해하기 -1 : 정의, 흐름, 인증방식 종류

해당 글에서는 Spring Boot 기반의 OAuth 2 Client에 대해서 이해를 돕기 위해 작성한 글입니다.  1) OAuth(Open Authorization)💡 OAuth(Open Authorization)- 인터넷 사용자들이 특정 웹 사이트를 접근하고자 할 때

adjh54.tistory.com

 
 

1. Standard flow


💡 Standard flow

- OAuth 2.0의 Authorization Code Flow를 기반으로 하는 가장 일반적이고 안전한 인증 방식을 의미하며, 주로 웹 애플리케이션에서 주로 사용되는 방식입니다.
- 해당 방식은 OAuth 2.0을 기반으로 하여 동작 방식은 비슷하지만, OIDC(OpenID Connect) 프로토콜이 추가되어서 인증(Authentication) 기능이 강화되었습니다.

https://blog.pages.kr/2839

 
 

1.1. Authorization Code Flow : OAuth 2.0 처리 방식


💡 Authorization Code Flow : OAuth 2.0 처리 방식

- Standard flow 방식은 OAuth 2.0의 처리 방식인 Authorization Code Flow 방식을 기반으로 구현되었기에 우선적으로 처리과정을 알아봅니다.
- 사용자는 자격인증(아이디/비밀번호 기반 로그인)을 통해서 인증코드(Authorization Code)를 먼저 발급받고, 이 인증코드를 기반으로 접근 토큰을 발급받아서 리소스에 접근이 하는 이중 접근 방식을 취합니다.

https://abdulsamet-ileri.medium.com/introduction-to-keycloak-227c3902754a

💡 [참고] OAuth 2.0 상세한 처리방식이 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java] Spring Boot OAuth 2 Client 이해하기 -1 : 정의, 흐름, 인증방식 종류

해당 글에서는 Spring Boot 기반의 OAuth 2 Client에 대해서 이해를 돕기 위해 작성한 글입니다.  1) OAuth(Open Authorization)💡 OAuth(Open Authorization)- 인터넷 사용자들이 특정 웹 사이트를 접근하고자 할 때

adjh54.tistory.com

 
 

1.2. Standard flow 처리 과정

 

💡 Standard flow 처리 과정

- OAuth 2.0의 Authorization Code Flow와 비교하였을 때, 접근 권한(Authorization)에 중점을 두어 액세스 토큰만 반환하지만 Standard flow의 경우는 액세스 토큰과 함께 ID 토큰도 반환하여 사용자 인증 정보를 제공합니다.
- 또한, Authorization Code Flow의 경우는 주로 리소스 접근 권한 부여에 대해 초점이 맞춰져 있지만, Standard flow의 경우는 사용자 인증(Authentication)과 권한 부여(Authorization)를 모두 처리합니다.

 

💡 Standard flow 상세 처리 과정

1. 로그인 (Login)
- 사용자가 클라이언트 애플리케이션에서 로그인을 시도하는 단계입니다.
- 예를 들어서, 사용자는 로그인 페이지를 클릭하는 단계입니다.

2. 인증 요청 생성(Generate authentication request)
- 클라이언트가 client_id, redirect_uri, scope 등의 필요한 파라미터를 포함한 인증 요청을 생성합니다.

3. Keycloak으로 리다이렉트(Redirect to Keycloak)
- 클라이언트가 사용자를 Keycloak의 인증 엔드포인트로 리다이렉트 시킵니다.

4. Keycloak으로 인증 요청 전송 (Send authentication request to Keycloak)
- 생성된 인증 요청이 Keycloak 서버로 전송됩니다.
- 해당 단계에서는 실제 Keycloak에서 구성한 로그인 페이지가 사용자에게 표시되는 단계입니다.

5. 사용자 인증(Authenticate user)
- 사용자가 Keycloak의 로그인 페이지에서 자신의 자격 증명을 입력하여 인증을 수행합니다.
- 해당 단계에서 사용자는 keycloak에서 구성한 로그인 페이지로 자격 증명(아이디/패스워드)을 입력하여 로그인을 수행하는 단계입니다.

6. 인가 코드 반환(Return authorization code)
- 인증이 성공적으로 완료되면, Keycloak은 인가 코드를 생성하여 클라이언트의 리다이렉트 URI로 전송합니다.
- 해당 단계에서는 로그인이 성공하고, 인가코드(AuthCode)를 발급받습니다.

7. Keycloak으로 토큰 요청 전송(Send token request to Keycloak)
- 클라이언트는 받은 인가 코드를 사용하여 Keycloak의 토큰 엔드포인트에 액세스 토큰을 요청합니다.
- 해당 단계에서는 이전 단계에서 발급받은 인가코드(AuthCode)를 기반으로 Access Token을 요청하며, 최종적으로 사용자에게 반환이 됩니다.

 
 

1.3. Direct Access Grants, Implicit Flow 방식보다 Standard Flow 방식이 보안성이 높은 이유는?


💡 Direct Access Grants, Implicit Flow 방식보다 Standard Flow 방식이 보안성이 높은 이유는?

1. 토큰 발급의 이중 단계 처리 & 토큰 교환 시 추가 인증

- Standard flow 방식에서는 다른 방식과 달리 두 단계로 토큰을 발급받습니다.
- 첫 번째로, 인가 코드(Authorization Code)를 발급받고, 이를 통해서 최종적으로 접근 토큰(Access Token)을 발급받는 두 단계로 진행됩니다.
- 인가 코드는 임시적이고 짧은 수명을 가지며, 중간에 탈취되더라도 실제 Access Token을 얻기 위해서는 client secret 정보가 추가로 필요하기 때문에 보안이 한층 강화됩니다.

- 반대로 Implicit Flow의 경우는 접근 토큰(Access Token)이 URL 파라미터로 전달되어 브라우저 히스토리나 로그에 노출될 수 있는 위험이 있습니다.


2. 백 채널 통신

- 서버-서버 간 통신으로 이루어지기 때문에 중요한 정보가 브라우저에 노출되지 않습니다.
- 프런트엔드 환경에서 토큰이 직접 노출되는 것을 방지할 수 있습니다.
- 예를 들어서, 사용자는 프런트엔드에서 로그인을 합니다. 이 로그인 정보를 기반으로 백엔드 서버가 Keycloak 서버와 직접 통신하여 인증 코드를 받습니다. 그리고 이 발급받은 인증코드를 사용하여 백엔드 서버가 다시 Keycloak과 통신하여 Access Token을 받아와 최종적으로 클라이언트 백엔드가 프런트엔드에 필요한 정보를 안전하게 전달합니다.

- 반대로 Direct Access Grants의 경우는 사용자의 자격증명(아이디/패스워드)이 클라이언트에 직접 노출되는 위험이 있습니다.


3. 인증 단계 분리

- 사용자 인증(로그인) 단계와 토큰 발급 단계가 명확히 구분되어 있습니다. 그리고 각 단계마다 독립적인 보안 검증이 가능하기에 문제 발생 시 다음 단계로 진행되지 않습니다.
- 단계가 분리가 되어서 인증 실패와 토큰 발급 실패를 분리하여 추적이 가능하며, 각 단계별로 다른 보안 정책을 적용할 수 있습니다.

- 반대로 Direct Access Grants의 경우는 분리가 되어 있지 않은 단일 단계를 통해서, 통신 즉시 토큰을 발급이 되어서 노출 위험이 있습니다.

 
 

2. Direct Access Grants


💡 Direct Access Grants

- REST API를 통해 직접 토큰을 요청하는 방식으로 사용자의 자격 증명(아이디/비밀번호)을 포함하여 요청하며, 별도의 리다이렉션 없이 즉시 토큰을 받을 수 있는 인증 방식을 의미합니다.
- 사용자의 자격 증명이 클라이언트 애플리케이션에 직접 노출되므로 신뢰할 수 있는 애플리케이션에서만 사용해야 합니다.

 

💡 [참고] 공식 사이트 내에 직접 REST API를 통해서 Keycloak과 통신하여 토큰을 반환받는 엔드포인트입니다.

https://www.keycloak.org/securing-apps/oidc-layers

 
 

2.1. Direct Access Grants 처리방식


💡 Direct Access Grants 처리방식

1. 사용자 자격증명 수집

- 클라이언트 애플리케이션은 사용자로부터 아이디와 비밀번호를 직접 수집합니다.
- 일반적으로 애플리케이션의 로그인 폼(application/x-www-form-urlencoded Content-Type)을 통해 입력받습니다

2. 토큰 요청

- 클라이언트는 수집한 자격증명을 Keycloak 토큰 엔드포인트로 직접 전송합니다.
- 예를 들어, 로컬 9001 포트에 구성한 Keycloak의 Realm에 [POST] http://localhost:9001/realms/dev-realm/protocol/openid-connect/token 엔드포인트로 요청합니다.
- 요청 로그인 폼으로는 grant_type, client_id, client_secret, username, password을 포함시켜서 전송합니다.
- [참고] 해당 URL을 참고하시면 해당 API 엔드포인트 정보를 확인할 수 있습니다. https://www.keycloak.org/securing-apps/oidc-layers


3. 자격증명 검증

- Keycloak 서버는 전달받은 사용자 자격증명의 유효성을 검증합니다
- 클라이언트 인증정보(client_id, client_secret)도 함께 확인합니다


4. 토큰 발급

- 검증이 성공하면 Keycloak은 즉시 액세스 토큰을 발급합니다
- 응답으로 access_token, refresh_token, token_type 등이 포함된 JSON을 반환합니다

5. 토큰 사용
- 클라이언트는 발급받은 액세스 토큰을 사용하여 보호된 리소스에 접근할 수 있습니다
- Authorization 헤더에 Bearer 토큰을 포함시켜 API 요청을 수행합니다

 

💡 [참고] Postman을 통해서 Keycloak 엔드포인트로 호출을 하면 아래와 같이 즉시 access_token, refresh_token을 반환받을 수 있습니다.

 

[ 더 알아보기 ]

💡 Direct Access Grants는 보안적으로 취약하지 않은가?

- 사용자의 아이디와 비밀번호가 클라이언트 애플리케이션에 직접 노출되기에 자격증명 노출의 위험이 있습니다. 또한 신뢰할 수 없는 클라이언트에서 사용할 경우 자격증명 탈취 위험이 있습니다.
- HTTPS를 반드시 사용해야 하며, 네트워크 구간에서 자격증명이 안전하게 전송되어야 합니다. 전송 보안에서 중간자 공격(Man-in-the-Middle) 위험이 있을 수 있습니다.
- 가능하면 Standard Flow와 같은 더 안전한 인증 방식을 사용하는 것이 권장됩니다

 
 

3. Implicit Flow


💡 Implicit Flow

- OAuth 2.0의 인증 방식 중 하나로, 클라이언트 사이드 애플리케이션에서 사용되는 단순화된 인증 흐름입니다.

- Standard flow 방식과 다르게 인가 코드 없이 바로 액세스 토큰을 받는 방식입니다.

 

3.1. Implicit Flow 처리 과정


💡 Implicit Flow 처리 과정

1. 사용자 로그인 시도
- 사용자가 로그인을 시도할 때, Keycloak의 로그인 페이지로 리다이렉트 되어 자격증명(아이디/패스워드)을 입력 요청을 합니다.

2. 로그인 성공
- 사용자가 로그인을 성공하면, 바로 액세스 토큰을 리다이렉트 URL로 전달이 됩니다.

3. 토큰 사용
- 사용자는 전달받은 액세스 토큰을 통해서 리소스에 접근합니다.

https://blog.pages.kr/2839

 

[ 더 알아보기 ]

💡 Standard flow 방식보다 단순화된 방식 같은데 보안적으로 취약하지는 않을까?

- 액세스 토큰이 URL 파라미터로 전달되어 브라우저 히스토리나 로그에 노출될 위험이 있습니다. 또한 인가 코드 단계가 생략되어 토큰 탈취에 대한 위험이 높습니다.
- 그리고 Refresh Token을 안전하게 저장하기 어려워 일반적으로 지원되지 않습니다. 이러한 보안상의 이유로 현대의 OAuth 2.0 구현에서는 Implicit Flow 대신 PKCE(Proof Key for Code Exchange)를 추가한 Authorization Code Flow를 권장합니다.

💡 PKCE(Proof Key for Code Exchange)는 뭘까?

- 주로 모바일 앱이나 Single Page Application(SPA)과 같은 공개 클라이언트에서 인증 코드 가로채기 공격을 방지하기 위해 사용됩니다.
- Authorization Code Flow에 추가적인 보안 계층을 제공합니다.

 
 

4. Service Accounts Roles


💡 Service Accounts Roles

- 서비스 계정(Service Accounts)에 할당할 수 있는 권한과 역할을 정의하고 이를 기반으로 Client Credentials Flow 방식을 통해 실제 토큰을 발급받아 인증하는 방식을 의미합니다. 이렇게 발급된 토큰에는 해당 서비스 계정에 부여된 권한 정보 및 역할이 포함되어 있어서, 서비스는 자신에게 허용된 범위 내에서만 리소스에 접근할 수 있습니다.

- 여기서 서비스 계정(Service Accounts)은 사용자 자체가 아닌 애플리케이션이나 서비스가 고유하게 가지고 있는 계정을 의미합니다. 각각의 서비스 계정은 특정 역할(Role)과 권한을 가질 수 있습니다. 또한, 서비스 별로 접근 제어(읽기, 쓰기, 삭제, 관리자 권한 등)를 가질 수 있습니다.

- 예를 들어서, 서비스 계정 A, B가 있고, 서비스 계정 A은 서비스 계정 B로 접근할 수 있다는 권한이 할당되었다고 가정하에 있습니다. 그렇게 되면 서비스 계정 A에서 계정 B로 접근할 때 발급받은 토큰을 통해서 인증하여 접근할 수 있습니다. 이는 토큰 내에 서비스 계정에 대한 권한 정보와 역할이 포함되어서 리소스에 대한 접근이 가능합니다.

- 자동화된 프로세스, 배치 작업, 마이크로서비스 간 통신 등에 활용됩니다.

 
 

4.1. Client Credentials Flow


💡 Client Credentials Flow

- Service Account가 실제로 인증을 수행할 때 사용하는 인증 방식을 의미합니다. 즉, Service Accounts Roles에서는 클라이언트에 할당할 수 있는 역할과 권한을 정의하며, Client Credentials Flow에서는 Service Accounts가 실제로 인증을 수행할 때 사용하는 인증방식을 의미합니다.

 
 

💡 Client Credentials Flow

1. 클라이언트 ID와 시크릿으로 액세스 토큰 요청 (Request access token for client ID and secret)
- 클라이언트가 자신의 ID와 시크릿을 사용하여 인증 서버에 액세스 토큰을 요청합니다.

2. 액세스 토큰 발급(Granted access token)
- 인증 서버는 클라이언트의 자격 증명을 확인하고 유효한 경우 액세스 토큰을 발급합니다.

3. 액세스 토큰으로 API 요청(API request with the access token)
- 클라이언트는 발급받은 액세스 토큰을 사용하여 보호된 리소스에 API 요청을 합니다.

4. API 응답(API response)
- 리소스 서버는 토큰을 검증하고 요청된 리소스에 대한 응답을 반환합니다.

https://developer.ebay.com/api-docs/static/oauth-client-credentials-grant.html

 
 

4.2. Service Accounts Roles + Client Credentials Flow 방식 처리 과정


💡 Service Accounts Roles 처리과정

1. 클라이언트 등록 및 설정
- Keycloak 관리 콘솔에서 클라이언트를 등록하고 Service Account Roles를 활성화하여 사용합니다.
- Assign role 버튼을 눌러서 필요한 역할(roles)과 권한을 클라이언트에 할당하여 설정합니다.

2. 클라이언트 인증 : Client Credentials Flow 방식
- 클라이언트 ID와 클라이언트 시크릿을 사용하여 인증합니다.
- grant_type=client_credentials 파라미터로 토큰 엔드포인트에 요청합니다,

3. 토큰 발급 : Client Credentials Flow 방식
- Keycloak은 클라이언트 자격 증명을 검증합니다.
- 유효한 경우 액세스 토큰 발급 (할당된 역할과 권한 정보 포함)합니다.

4. API 호출
- 발급받은 액세스 토큰으로 보호된 리소스에 접근합니다.
- 토큰에 포함된 권한 범위 내에서만 API 호출 가능하며 사용자가 아닌 서비스 계정 콘텍스트로 동작

 
 
 
 

5. OAuth 2.0 Device Authorization Grant


💡 OAuth 2.0 Device Authorization Grant

- 입력 기능이 제한된 디바이스(IoT 기기, 스마트 TV)와 같은 디바이스에서 사용되는 인증 방식을 의미합니다.
- 사용자는 디바이스로부터 제공받은 사용자 코드와 함께 검증 URL을 다른 기기에서 입력함으로써 간편하게 인증을 완료할 수 있습니다.
- 스마트 TV 애플리케이션, IoT 디바이스, 게임 콘솔, 프린터 및 스캐너 등에서 사용합니다.

 
 

5.1. Device Authorization Grant 처리 과정


💡 Device Authorization Grant 처리 과정

1. 디바이스 코드 요청(Device Code Request)
- 사용자가 로그인 페이지로 접근하게 되면 Device Authorization 엔드포인트로 인증 요청을 하게 됩니다.
- 이 과정에서 verification_uri와 user_code를 생성하여서 검증 URL 혹은 QR 코드, 일반 코드를 생성합니다.

2. 디바이스의 폴링 (Poll with Device Code)
- 디바이스는 주기적으로 Keycloak의 토큰 엔드포인트에서 device_code를 사용하여서 폴링을 수행합니다.
- 해당 폴링 과정은 클라이언트가 서버로 주기적으로 요청을 보내서 상태 변경이나 새로운 데이터를 확인하는 과정을 의미합니다.- 즉, Keycloak은 사용자 인증이 완료될 때까지 수행합니다.

3. 사용자 코드 검증 및 인증(Access verification URL Enter User Code)
- 사용자는 디바이스에 표시된 검증 URL을 다른 기기(예: 스마트폰, 컴퓨터)에서 방문합니다.
- 검증 URL 페이지에서 디바이스에 표시된 user_code를 입력합니다.
- Keycloak은 입력된 user_code의 유효성을 검증합니다. user_code가 유효한 경우, 사용자는 일반적인 로그인 절차를 진행합니다.

4. 접근 토큰 발급 (Response 200 with Access Token)
- 사용자 인증 완료 시, Keycloak은 디바이스의 다음 폴링 요청에 액세스 토큰 발급합니다. 발급된 토큰에는 Keycloak에서 설정된 권한과 역할 정보가 포함됨

https://docs.public.oneportal.content.oci.oraclecloud.com/en-us/iaas/Content/Identity/api-getstarted/DCGT.htm

 
 

6. OIDC CIBA(Connect Client-Initiated Backchannel) Grant


💡 OIDC CIBA(Connect Client-Initiated Backchannel) Grant

- OpenID Connect의 확장 기능으로, 클라이언트가 사용자의 직접적인 상호작용 없이 인증을 시작할 수 있게 해주는 인증 방식입니다.
- 사용자가 인증을 요청한 디바이스(예: ATM, 웹사이트)와 실제 인증이 이루어지는 디바이스(예: 스마트폰)가 물리적으로 분리되어 있습니다.
- 이는 백 채널(서버 간 통신)을 통해서 이루어지는 특징을 가지고 있습니다.

- 주로 금융거래 승인, 기업 보안 시스템, 의료 정보시스템과 같은 경우에 사용이 됩니다. 예를 들어서, 금융거래 승인 부분에서 사용자가 ATM에서 현금을 인출을 시도할 때, 은행 앱으로 푸시 알림을 보내 승인을 요청합니다.

https://www.keycloak.org/securing-apps/oidc-layers

 
 

6.1. CIBA Grant 처리 과정


💡 CIBA Grant 처리 과정

1. 인증 요청 시작 (Authentication Request)
- 클라이언트가 Keycloak의 백 채널 인증 엔드포인트로 인증 요청을 보냅니다
- 요청에는 사용자 식별자(login_hint)와 필요한 스코프 정보가 포함됩니다

2. 인증 요청 검증 (Request Validation)
- Keycloak은 클라이언트의 인증 요청을 검증합니다
- auth_req_id를 생성하여 클라이언트에게 반환합니다

3. 사용자 인증 프로세스 (User Authentication)
- Keycloak은 사용자의 인증 디바이스(예: 스마트폰)로 인증 요청을 전송합니다
- 사용자는 자신의 디바이스에서 인증 요청을 승인하거나 거부할 수 있습니다

4. 토큰 요청 및 발급 (Token Request & Issuance)
- 클라이언트는 auth_req_id를 사용하여 주기적으로 토큰 엔드포인트를 폴링 합니다
- 사용자가 인증을 승인하면 Keycloak은 액세스 토큰을 발급합니다.
- 발급된 토큰에는 요청된 스코프와 클레임 정보가 포함됩니다

https://curity.io/resources/learn/device-flow-vs-ciba/

 
 
 
 
 
오늘도 감사합니다 😀

 
 
 
 
 

그리드형