SAML 보안 요약서
보안 선언 마크업 언어 (SAML) 및 해당 보안 기능에 대한 빠른 참조 가이드입니다. 주요 용어, 구현 팁, 기업 환경에서의 SAML 기반 인증 및 권한 부여를 안전하게 하기 위한 모범 사례를 이해합니다.
소개
보안 선언 마크업 언어 (SAML)는 주로 신원 제공자와 서비스 제공자 간의 당사자 간 인증 및 권한 부여 데이터를 교환하기 위한 개방형 표준입니다. SAML은 SSO(단일 로그인) 및 ID 연합에 사용되는 보안 선언을 위한 XML 기반 마크업 언어입니다. 이는 인증 및 권한 부여 목적으로 기업 환경에서 자주 사용됩니다.
표준 SAML 인증 흐름
- 사용자는 서비스 제공자(SP)로 작동하는 클라이언트 애플리케이션에 대한 액세스를 요청합니다.
- SP는 신원 제공자(IdP)에게 SAML SSO 인증 요청을 보내고 사용자를 IdP로 리다이렉트합니다.
- 사용자가 아직 인증되지 않은 경우 IdP는 자격 증명을 입력하도록 요청합니다.
- 사용자가 자격 증명을 입력하고 IdP가 사용자를 인증합니다.
- IdP는 사용자의 인증 상태와 속성을 포함하는 SAML 응답 선언을 SP에 전송한 후 사용자를 SP로 리다이렉트합니다.
- SP는 SAML 응답 선언을 수신, 검증하고 사용자에게 액세스를 승인합니다.
SAML의 보안 요소
SP 엔터티 ID
SP 엔터티 ID는 SAML 인증 맥락에서 SP의 고유한 배지로 생각할 수 있습니다. 이 ID는 SP의 메타데이터의 중요한 부분이며, IdP와 신뢰를 구축하고 안전한 통신을 보장하기 위해 공유됩니다.
SP 엔터티 ID의 사용:
- 메타데이터 등록:
EntityID
속성은 IdP와 신뢰 관계를 구축하기 위해 공유된 SP의 메타데이터의 일부입니다. 이는 SAML 상호 작용을 위한 필요한 구성 세부 정보를 얻기 위해 SP의 메타데이터를 식별하는 유일한 식별자로 작동합니다. - 인증 요청: SP 엔터티 ID는 요청하는 SP를 명확하게 식별하기 위해 IdP로 전송된 SAML 인증 요청에 포함됩니다. IdP는 이 정보를 사용하여 요청을 검증하고 적절한 인증 맥락을 결정합니다.
- 선언 청중: 사용자가 성공적으로 인증된 후 SP 엔터티 ID가 SAML 선언에 청중 제한으로 포함됩니다. 이는 선언이 지정된 SP에게만 의도되어 있고 다른 SP에 의해 악용될 수 없음을 보장합니다.
IdP 엔터티 ID
반대로, IdP 엔터티 ID는 IdP의 특별한 라벨입니다. 이는 SP가 IdP를 SAML 생태계 내에서 식별할 수 있도록 돕습니다. 이 ID는 IdP의 메타데이터에 포함되며 SP와 공유되어 신뢰 관계와 안전한 연결을 육성합니다.
IdP 엔터티 ID의 사용:
- 메타데이터 등록:
EntityID
속성은 각각 신뢰 관계를 구축하기 위해 SP와 공유된 IdP의 메타데이터에 포함됩니다. 이는 IdP의 메타데이터를 찾고 SP가 SAML 응답을 검증할 수 있도록 필요한 구성 세부 정보를 얻기 위한 유일한 식별자로 작동합니다. - 선언 발급자: IdP가 SAML 선언을 생성할 때, 자신의 엔터티 ID를 발급자로 포함합니다. 이 속성은 선언을 발급한 엔터티를 나타내며 SP가 선언의 진위성과 무결성을 검증하는 데 도움이 됩니다.
릴레이 상태
릴레이 상태는 SAML 인증에서 SP와 IdP 간의 상태 정보를 전송하는 데 사용되는 매개변수입니다. 이는 SP가 시작한 SSO 흐름과 IdP가 시작한 SSO 흐름을 연결하는 다리 역할을 하여 인증 과정에서 사용자의 컨텍스트와 세션 상태를 유지합니다.
릴레이 상태의 사용:
- 사용자 컨텍스트 유지: 릴레이 상태를 통해 SP는 인증 과정에서 IdP로 추가 정보를 전달할 수 있습니다. 이 정보에는 사용자의 세션 상태, 애플리케이션 컨텍스트 또는 인증 흐름 전반에 걸쳐 보존해야 하는 기타 관련 데이터가 포함될 수 있습니다. 예를 들어 인증 전에 사용자가 접근하고 있던 애플리케이션의 URL이나 세션 ID와 같은 것입니다.
- CSRF 공격 방지: 릴레이 상태는 SAML 인증 동안 CSRF 공격을 방지하는 데 매우 중요합니다. 인증 요청에 고유하고 예측할 수 없는 릴레이 상태 값을 포함시킴으로써 SP는 SAML 응답의 무결성을 확인하고 원래 요청과 일치하는지 확인할 수 있습니다.
선언 서명
선언 서명은 SAML에서 무결성, 진정성, 비간섭성을 보장하는 중요한 보안 기능입니다. 이는 IdP의 개인 키를 사용하여 SAML 선언을 디지털 서명하고, SP는 그 출처를 확인하고 변조 시도를 감지할 수 있도록 합니다.
선언 서명이 작동하는 방식:
- 키 쌍 생성: IdP는 개인 키를 사용하여 SAML 선언을 서명하고, 공개 키는 검증을 위해 SP와 공유되는 공개-개인 키 쌍을 생성합니다. 이 비대칭 암호화 방식은 IdP만 선언을 서명할 수 있고, SP가 이를 검증할 수 있도록 보장합니다.
- 공유 인증서: IdP는 선언 서명을 검증하기 위해 사용하는 공개 키를 포함한 공개 키 인증서를 SP에게 제공합니다. 보통 이 인증서는 IdP의 메타데이터의 일부로 제공되거나, SP는 안전한 다운로드 과정을 통해서도 인증서를 얻을 수 있습니다.
- 선언 서명: 사용자를 인증한 후, IdP는 개인 키를 사용하여 SAML 선언에 디지털 서명을 합니다. 이 서명은 공개 키 인증서와 함께 선언에 포함되어 SP가 선언의 진정성을 확인할 수 있게 합니다.
- 선언 검증: SAML 선언을 수신하면 SP는 IdP의 공개 키를 사용하여 선언 시그니처를 검증합니다. 서명이 유효할 경우, SP는 선언을 신뢰하고 사용자에게 액세스를 부여합니다.
선언 암호화
SAML은 서명 외에도 IdP와 SP 간에 전송되는 민감한 사용자 속성 및 데이터를 보호하기 위해 선언 암호화를 지원합니다. 선언을 암호화하여, IdP는 오직 의도된 수신자(SP)만이 선언의 내용을 해독하고 접근할 수 있도록 보장하며, 사용자 프라이버시와 기밀성을 보호합니다. 선언 암호화는 SAML에서 데이터 보호를 강화하는 선택적 보안 기능입니다.
선언 암호화의 사용:
- 민감한 속성 보호: 선언 암호화는 개인 식별 정보(PII), 금융 데이터, 의료 기록과 같은 민감한 사용자 속성을 보호하는 데 특히 유용합니다. IdP는 선언 내에 이러한 속성을 암호화함으로써 비인가 접근을 방지하고 데이터 기밀성을 확보합니다.
선언 암호화가 작동하는 방식:
- 키 교환: IdP와 SP는 SAML 선언을 보호할 암호화 키를 공유하기 위해 안전한 키 교환 메커니즘을 구축합니다. 이 과정은 대칭 암호화 키나 공개 키 암호화 방식 등을 사용할 수 있으며, 암호화 알고리즘과 키 관리 전략에 따라 결정됩니다.
- 속성 암호화: IdP는 SAML 선언을 생성한 후, 공유된 암호화 키를 사용하여 민감한 사용자 속성을 암호화합니다. 암호화된 속성은 선언 내에 포함되며, 오직 SP만이 이를 해독하여 접근할 수 있도록 합니다.
- 선언 해독: SP는 암호화된 선언을 수신한 후, 공유된 암호화 키를 사용하여 보호된 속성을 해독합니다. 이를 통해 SP는 사용자의 민감한 데이터를 안전하게 접근하고 필요에 따라 처리할 수 있습니다.
바인딩 메서드
SAML 바인딩 메서드는 SP와 IdP 간의 다양한 통신 프로토콜을 통해 SAML 메시지가 전송되는 방식을 정의합니다. 이는 SAML 선언 및 요청을 교환하는 데 사용되는 인코딩, 전송 및 보안 메커니즘을 명시하여 관련 당사자 간에 안전하고 신뢰할 수 있는 통신을 보장합니다.
양측 SP와 IdP는 메타데이터에서 지원하는 바인딩 메서드를 명시하며, 이를 통해 SAML 상호작용을 위한 적절한 방법을 협상할 수 있습니다. 바인딩 메서드의 선택은 메시지 크기, 보안 요건 및 통신 채널의 특성에 따라 다릅니다.
SAML 바인딩 메서드:
- HTTP 리다이렉트: SAML 메시지가 URL 매개변수로 인코딩되어 HTTP 리다이렉트를 통해 전송됩니다. 이 바인딩은 메시지 크기가 제한적이고 통신 채널이 안전하지 않은 경우 적합합니다.
- HTTP POST: SAML 메시지가 양식 매개변수로 인코딩되어 HTTP POST 요청을 통해 전송됩니다. 이 바인딩은 메시지 크기가 URL 길이 제한을 초과하거나 추가 보안 조치가 필요한 경우 사용됩니다.
- 아티팩트: SAML 메시지가 아티팩트로 불리는 단기간 토큰을 사용하여 SP와 IdP 간의 안전한 후방 채널을 통해 전송됩니다. 이 바인딩은 메시지 기밀성과 무결성이 중요하고 통신 채널이 안전한 경우 적합합니다.
가장 흔한 바인딩 메서드:
- 인증 요청: SP에서 IdP로의 인증 요청은 주로 그 단순성과 효율성 때문에 HTTP 리다이렉트를 통해 전송됩니다. SP는 SAML 요청을 URL 매개변수로 인코딩하고 사용자의 브라우저를 IdP로 리다이렉트하여 인증합니다. 이는 SP 가 시작한 SSO 흐름으로 알려져 있습니다.
- 선언 응답: IdP에서 SP로의 SAML 응답 선언은 일반적으로 HTTP POST 바인딩 메서드를 통해 전송됩니다. IdP는 SAML 선언을 양식 매개변수로 인코딩하여 이를 SP로 다시 전송하여 검증합니다. 이는 URL에 민감한 데이터를 노출하지 않고 안전하게 선언이 전송되도록 보장합니다. 또한 HTTP POST 바인딩은 HTTP 리다이렉트 바인딩에 비해 더 큰 메시지 크기를 처리할 수 있습니다.
SAML 선언의 보안 요소 및 고려 사항
발급자
앞서 언급했듯이, 발급자는 SAML 선언에서 선언을 발급한 엔터티를 식별하는 주요 속성입니다. 발급자는 주로 사용자를 인증하고 선언을 생성한 IdP입니다. 선언에 발급자 속성을 포함시킴으로써 SP는 선언의 출처를 검증하고 신뢰할 수 있는 출처로부터 왔음을 보장할 수 있습니다.
서명
SAML 선언에서 서명 요소는 IdP가 생성한 디지털 서명을 포함하여 선언의 무결성과 진정성을 보장합니다. 서명은 IdP의 개인 키를 사용하여 생성되며, 공개 키 인증서와 함께 선언에 포함되어 SP가 선언을 검증할 수 있도록 합니다. 서명을 검증함으로써 SP는 선언이 변조되지 않았으며 예상된 IdP로부터 왔음을 확인할 수 있습니다.
조건
SAML 선언에서 조건 요소는 선언의 유효성과 사용에 적용되는 제약과 제한을 정의합니다. 이는 선언의 유효 기간, 청중 제한, 기타 맥락적 제약 등을 포함하며, SP가 선언을 처리할 때 이를 강제해야 합니다.
인증 서술문
인증 서술문(AuthnStatement)은 사용자의 인증 상태와 맥락에 대한 정보를 제공하는 SAML 선언의 핵심 구성 요소입니다. 인증에 사용된 방법, 인증 시간, 관련 인증 맥락 정보 등이 포함되어 있어 SP가 사용자의 인증 상태를 기반으로 정보에 근거한 액세스 제어 결정을 내릴 수 있습니다.
인증 서술문 속성:
- AuthenticationContext: username-password, 다중요소 인증, 단일 로그인과 같은 사용자 인증의 방법 및 맥락을 설명합니다. 이 속성은 SP가 인증 과정의 강도와 신뢰성을 평가하고 적절한 액세스 제어를 결정하는 데 도움이 됩니다.
- AuthenticationInstant: IdP가 사용자를 인증한 시간을 나타냅니다. 이 타임스탬프는 인증의 신선도를 확인하고 재생 공격이나 세션 하이재킹을 방지하는 데 필수적입니다.
- SessionNotOnOrAfter: 사용자가 서비스를 접근하기 위해 다시 인증이 필요하게 되는 세션의 만료 시간을 지정합니다. 이 속성은 세션 관리 정책을 시행하고 비인가된 접근의 위험을 경감하는 데 도움이 됩니다.
SAML 보안 모범 사례
- 안전한 바인딩 메서드 사용: 보안 요구 사항과 통신 채널 특성에 따라 적합한 SAML 바인딩 메서드를 선택하세요. 민감한 데이터 전송에는 HTTP POST를 사용하고 단순한 요청에는 HTTP 리다이렉트를 사용하세요.
- 선언 서명 검증: SAML 선언의 디지털 서명을 검증하여 선언의 무결성과 진정성을 보장하세요. IdP의 공개 키 인증서를 사용하여 서명을 검증하고 변조 시도를 탐지하세요.
- 청중 제한을 강제: SAML 선언에 청중 제한을 포함시켜 선언의 범위를 의도된 SP에게만 제한하세요. 이는 선언 재생 공격과 다른 서비스 제공자의 비인가된 접근을 방지합니다.
- 메타데이터 교환 보호: SP와 IdP의 메타데이터 교환을 보호하여 메타데이터 변조와 스푸핑 공격을 방지하세요. 안전한 채널과 메커니즘을 사용하여 메타데이터를 안전하게 공유하세요.
- 안전한 릴레이 상태 처리 구현: SAML 인증 중 CSRF 공격을 방지하기 위해 고유하고 예측할 수 없는 릴레이 상태 값을 사용하세요. 릴레이 상태의 무결성과 진정성을 보장하기 위해 이를 검증하세요.
- 세션 관리 시행: 세션 만료 정책을 정의하고 세션 타임아웃을 시행하여 세션 하이재킹과 비인가된 접근 위험을 경감하세요. SAML 선언에 세션 관련 속성을 사용하여 사용자 세션을 안전하게 관리하세요.
- 민감한 속성 암호화: 필요할 경우 SAML 선언 내에 민감한 사용자 속성을 암호화하여 사용자 프라이버시와 데이터 기밀성을 보호하세요. 민감한 데이터를 보호하기 위해 안전한 암호화 알고리즘과 키 관리 방식을 사용하세요.
SAML 대안
SAML은 SSO 및 ID 연합에 널리 채택된 표준으로 강력한 기능 세트와 보안 메커니즘을 제공하지만, 그 효율성은 현대적 애플리케이션의 진화된 보안과 사용성 요구를 충족하는 데 어려움을 겪을 수 있습니다. 현재의 OAuth 2.0 기반 OpenID Connect (OIDC)와 비교할 때, SAML은 보다 복잡하며 OIDC가 제공하는 다양한 보안 기능의 강화된 측면이 부족합니다. 예를 들어, OIDC의 다중 보안 요청 승인을 위한 인증 코드 부여 흐름은 상대적으로 간단한 SAML 선언 교환 흐름보다 더 안전한 접근 방식을 제공합니다. 보다 현대적이고 유연한 ID 연합 솔루션을 채택하려는 조직에게는 OIDC가 SAML에 대한 실현 가능한 대안이 될 수 있습니다.