
개요
오픈소스 솔루션의 인증을 통합하는 인증 서버를 커스텀 개발 하면서 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) 같은 표준을 기반으로 사용자를 인증하거나 특정 리소스를 이용하도록 허가 또는 관리합니다.
요약
SAML | OAuth 2.0 | OIDC (OpenIdConnect) | |
Format | XML | JSON | JSON |
Authorization | O | O | O |
Authentication | O | X ( Pseudo Authentication ) | O |
Created | 2001 | 2005 | 2006 |
Best Practice | SSO For Enterprise (Mobile X) | API Authorization | SSO For Consumer Applications |
인증/ 인가 는 간단하게 아래와같이 정의할 수 있습니다
Authentication (인증) : 내가 누구인지
Authorization (인가) : 내가 어떤 권한을 갖고 있는지
1. SAML(Security Assertion Markup Language)

- 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)

참고 : 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)

- OIDC는 권한 허가 프로토콜인 OAuth 2.0을 이용하여 만든 인증(Authentication) 프로토콜입니다.
- OpenID Connect는 권한부여 서버에 의해 작동하는 인증 시스템을 기반으로 클라이언트가 사용자를 판단할 수 있게 해줍니다.
- 권한부여 서버에 유저 로그인과 동의를 요청할 때, openid라는 스코프를 정의하면 OpenID Connect 사용이 가능합니다.
참고
- https://www.okta.com/identity-101/whats-the-difference-between-oauth-openid-connect-and-saml/
- https://developers.google.com/identity/openid-connect/openid-connect?hl=ko
- https://jwt.io/
'슬슬의 공부' 카테고리의 다른 글
[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 |