슬슬의 공부

SSO 인증/인가 프로토콜 - SAML OAuth OIDC

seulseul 2023. 11. 12. 23:41

 

개요

오픈소스 솔루션의 인증을 통합하는 인증 서버를 커스텀 개발 하면서 SSO , Saml , OAuth2 , OpenID Connect (OIDC)  에 대해 정리하게 됐습니다.
 
SSO (Single Sign On) 은 단어 그대로 1회 사용자 인증으로 다수의 어플리케이션 및 웹사이트에 대한 사용자 로그인을 허용하는 인증 솔루션입니다.
 
SSO는 한 번 자격 증명이 검증된 사용자에게는 반복되는 로그인 없이 모든 암호 보호 리소스에 액세스하도록 하여 보안과 사용자 경험을 모두 충족할 수 있습니다.
 
이같은 편의성은 IDP(IDentity Provider)라 불리는 신원확인 서비스가 제공합니다.
IDP는 SAML(Security Assertion Markup Language), OAuth 2.0, OIDC(OpenID Connect) 같은 표준을 기반으로 사용자를 인증하거나 특정 리소스를 이용하도록 허가 또는 관리합니다.
 

요약 

 SAMLOAuth 2.0OIDC (OpenIdConnect)
FormatXMLJSONJSON
AuthorizationOOO
AuthenticationOX
( Pseudo Authentication )
O
Created200120052006
Best Practice
SSO For Enterprise
(Mobile X)
API AuthorizationSSO For
Consumer Applications

 
인증/ 인가 는 간단하게 아래와같이 정의할 수 있습니다

Authentication (인증) : 내가 누구인지
Authorization  (인가) : 내가 어떤 권한을 갖고 있는지

 

1. SAML(Security Assertion Markup Language)

https://learn.microsoft.com/en-us/entra/architecture/auth-saml
  • 2001년 OASIS에서 정의한 개방형 Authentication(인증) 및 Authorization(인가) 표준
  • SAML은 인증을 위해 JWT 가 아닌 XML 포맷 의 메시지를 교환하는 방식을 사용합니다.
    • SAML은 사용자 이름, email 등과 같은 데이터를 XML을 사용하여 전송합니다.

 

saml 전문 예시

<md:EntityDescriptor
	xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
	xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
	xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="http://localhost">
	<md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
		<md:KeyDescriptor use="signing">
			<ds:KeyInfo>
				<ds:KeyName>2ZAjXarXobkjcI4ZaOPAU9EiDXw8xyrTJhQufKnnAds</ds:KeyName>
				<ds:X509Data>
					<ds:X509Certificate>MIIClzCCAX8CBgGI17RxEjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0b2JlMB4XDTIzMDYyMDA3MjY0NloXDTMzMDYyMDA3MjgyNlowDzENMAsGA1UEAwwEdG9iZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJgW0zG1nMdzlqK8cUeTXrY/Fh6ROTjSw0m2SZ4laQq9sP4nrlW/+mK5A2Uiu503NB2DFnSUf28kxYBI+c0NHuQF19Wvomo008AiBIueeL3bBqa13eRURq1t6DJoBQz7v7koqkC9olpEnsnGokD32iGLCs7eL4oLrNaYVnYPw45xWxIYiMFiotXYfPjepLwnWrLI2dB8/2RmAYxKtnwVhXS9OI2bFrLPZRAC0QRQXl+neKSm8WuNKmjLBpgZvNH5SXKwSRX8tQpRRIFtmPKxBRIMoLwmB10dlvKOBxcRt+q6LZTMiy243dSRZYWPZqWPyG96TEYGbFhmqzfD/qe5NIECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAJqawVfUjERERCJgqB1nAQRSKQYyeagGky2WwlGdHk5LJbzuhvYAckI2xDy6UY0/xdLD3dSdDegNwDjFfXekL9+jFYkt/y+Ab969topxX92Gifl1EdZ1ZYry4alLLrqN2WpRxVETXBuFMmS8H9cqt9xxtWC1mmMBSZmHDe9yGpasD1E/M12LOG2b5Q6sXyrKJTkdw4jOUPR7cavdKv2S0/IK+4IjYstqKGy7sljFPfEDHcRBkN8DpttIWtVQ2PWxoTDWVwqxu58r260LjPeep1NXwXwBUMlpQiLG1ryafV6SnZWSE5D8KOogJ/MUgYXyhjQoQxZGSlpUeZC2A6D0Vzg==</ds:X509Certificate>
				</ds:X509Data>
			</ds:KeyInfo>
		</md:KeyDescriptor>
		<md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="/protocol/saml/resolve" index="0"/>
		<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="/protocol/saml"/>
		<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="/protocol/saml"/>
		<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="/protocol/saml"/>
		<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
		<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
		<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
		<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
		<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="/protocol/saml"/>
		<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="/protocol/saml"/>
		<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="/protocol/saml"/>
		<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="/protocol/saml"/>
	</md:IDPSSODescriptor>
</md:EntityDescriptor>

 

2. OAuth 2.0 (Open Authentication)

https://learn.microsoft.com/en-us/entra/architecture/auth-oauth2

 

참고 : OAuth 2.0
  • OAuth 는 모바일 플랫폼에서의 SAML 의 단점을 보완하기 위해 개발되었으며, JSON 을 기반으로 동작합니다.
  • SAML은 Authentication / Authorization (인증/인가)를 둘 다 다루는데 반해 OAuth는 Authorization를 목적으로 설계되었습니다.
  • OAuth의 핵심은 Access Token인데, Access Token은 임의의 문자열 값이고, 토큰을 발급해 준 서비스만이 해당 토큰의 정보를 알고 있습니다.
  • Refresh Token은 Access Token보다 유효기간이 길며, Access Token이 만료되도 Refresh Token이 만료되지 않는 이상 로그인 없이 계속 발급받을 수 있습니다.
  • Access Token은 정보를 요청하는데 쓰이는 토큰이지, 인증을 하는데 쓰이는 토큰이 아닙니다. 따라서 해당 토큰으로 인증을 대신하는것은 보안에 취약합니다.이러한 문제점을 해결하기 위해 oidc 프로토콜이 탄생했습니다.
     

3. OIDC (Open ID Connect)

https://learn.microsoft.com/en-us/entra/architecture/auth-oidc

 

  • OIDC는 권한 허가 프로토콜인 OAuth 2.0을 이용하여 만든 인증(Authentication) 프로토콜입니다.
  • OpenID Connect는 권한부여 서버에 의해 작동하는 인증 시스템을 기반으로 클라이언트가 사용자를 판단할 수 있게 해줍니다.
  • 권한부여 서버에 유저 로그인과 동의를 요청할 때, openid라는 스코프를 정의하면 OpenID Connect 사용이 가능합니다.

 
 
 
 
 


참고

 

'슬슬의 공부' 카테고리의 다른 글

[Java] Checked Exception vs Unchecked Exception  (0) 2023.03.09
[Java] Error vs Exception  (0) 2023.03.09
자료구조  (0) 2023.01.24
[프로그래머스] 올바른 괄호  (0) 2023.01.24
[프로그래머스] 카펫  (0) 2023.01.24