์ธ์ฆ

Security Assertion Markup Language (SAML)

๋‚ด ์ดํ•ด๋ฅผ ํ†ตํ•ด SAML์˜ ์‹ ๋น„ํ™”๋ฅผ ํ’€๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค

  • #auth
  • #okta
  • #saml
  • #sso

SAML(Security Assertion Markup Language)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๋‹น์‚ฌ์ž ์ด์ƒ ๊ฐ„์˜ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ XML ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

SAML์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ SSO(Single Sign-On)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์žฌ์ธ์ฆ ์—†์ด๋„ ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ธ์ฆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

SAML์€ ๋‹ค๋ฃจ๊ธฐ ๋ณต์žกํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ์ „ํžˆ ๋” ๊นŠ์€ ์ฐจ์›์—์„œ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๊ธ€์€ ์ œ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†Œ๊ธˆ ํ•œ ์•Œ์„ ๋ฟŒ๋ ค์„œ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•  ์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์ €๋Š” ์ง€๊ธˆ์€ ํ•œ๊ตญ์–ด ์ž˜ ๋ง ํ•  ์ˆ˜ ์—†์–ด์„œ ์ด์ƒํ•œ ๋ฌธ๋ฒ•๊ณผ ๋‹จ์–ด๋ฅผ ์ฐพ์•„์˜จ ๊ฒƒ์„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์ด ๊ผญ ๋‹ค์‹œ ๋ฆฌ๋ทฐ๋ฅผ ํ• ๊ฒ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ

SAML์€ ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์—ญํ• ์„ ์ง€์ •ํ•˜๋ฉฐ, ์ด๋Š” ์ฃผ์ฒด(์‚ฌ์šฉ์ž), ID ์ œ๊ณต์ž(IdP) ๋ฐ **์„œ๋น„์Šค ์ œ๊ณต์ž(SP)**์ž…๋‹ˆ๋‹ค.

์ฃผ์ œ(์‚ฌ์šฉ์ž)

์•ฑ์ด๋‚˜ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.

ID ์ œ๊ณต์ž(IdP)

์‹๋ณ„ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹น์‚ฌ์ž. ID ์ œ๊ณต์ž์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Google Workspace
  • Microsoft
  • Okta

์„œ๋น„์Šค ์ œ๊ณต์ž(SP)

์‚ฌ์šฉ์ž๊ฐ€ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด SAML ํ†ตํ•ฉ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

SAML ์ง€์› ์„œ๋น„์Šค ์ œ๊ณต์ž์˜ ์˜ˆ:

  • Salesforce
  • Pluralsight
  • Microsoft 365

์ธ์ฆ ํ๋ฆ„

SAML SSO๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์—๋Š” ID ์ œ๊ณต์ž ์‹œ์ž‘(IdP Init) ํ๋ฆ„๊ณผ ์„œ๋น„์Šค ์ œ๊ณต์ž ์‹œ์ž‘(SP Init) ํ๋ฆ„์˜ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ œ๊ณต์ž ์‹œ์ž‘(SP Init)

์„œ๋น„์Šค ์ œ๊ณต์ž(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์—์„œ ์‹œ์ž‘๋œ ์ธ์ฆ ํ๋ฆ„. ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ๋กœ๊ทธ์ธ์„ ์š”์ฒญํ–ˆ์ง€๋งŒ IdP๋กœ ๋ฆฌ๋””๋ ‰์…˜๋จ.

์„œ๋น„์Šค ์ œ๊ณต์ž ์‹œ์ž‘ ํ๋ฆ„

ID ์ œ๊ณต์ž ์‹œ์ž‘(IdP Init)

ID ์ œ๊ณต์ž(IdP)์—์„œ ์‹œ์ž‘๋œ ์ธ์ฆ ํ๋ฆ„. ์ฐจ์ด์ ์€ ์ด ํ๋ฆ„์— SAML ์š”์ฒญ์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋“ฑ๋ก๋œ ์•ฑ์ด ์žˆ๋Š” IdP ํฌํ„ธ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด IdP๋Š” SP์— ์š”์ฒญ๋˜์ง€ ์•Š์€ SAML ์‘๋‹ต์„ ์ „์†กํ•˜์—ฌ ๋กœ๊ทธ์ธ ์„ธ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” Okta์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Œ€์‹œ๋ณด๋“œ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

Okta ๋Œ€์‹œ๋ณด๋“œ

์–ดํœ˜

SAML ์š”์ธต

IdP๋กœ ์ „์†กํ•˜๋Š” ์ธ์ฆ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์š”์ฒญํ•˜๊ธฐ ์ „ ์‚ฌ์šฉ์ž์˜ ๋งˆ์ง€๋ง‰ ํ™œ์„ฑ ๋ฆฌ์†Œ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” **๋ฆด๋ ˆ์ด ์ƒํƒœ(relay state)**๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ฆ ํ›„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์žˆ๋˜ ์œ„์น˜๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” signicat.com์˜ AuthnRequest ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" AttributeConsumingServiceIndex="1"
                     Destination="https://yourdomain/broker/sp/saml/login" ForceAuthn="true"
                     ID="_b6a016332e19a825bb42917c9870c93a" IssueInstant="2021-03-09T10:26:17.210Z"
                     Version="2.0">
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
        yourEntityID
    </saml2:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        ... XML Signature ...
    </ds:Signature>
</saml2p:AuthnRequest>

SAML ์‘๋‹ต

SAML ์‘๋‹ต์—๋Š” XML Signatures(DSig)๋กœ ์„œ๋ช…๋œ ๋ฌธ์žฅ(assertion)์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์„ฑ๊ณผ ๊ฐ™์€ ํ”„๋กœํ•„ ์ •๋ณด์ธ ์†์„ฑ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. SAML ์‘๋‹ต์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ž์ฒด **ACS(Assertion Consumer Service)**์— ์˜ํ•ด ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฑฐ๋Š” signicat.com์˜ ์‘๋‹ต ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
                 Destination="https://yourspdomain/acs" ID="_c5bb9d944845c6ee1ddb85e59330ab36"
                 InResponseTo="_900A8CD85314D6317FA8C61B49D021DA" IssueInstant="2021-03-09T15:42:11.907Z" Version="2.0">
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">https://yourbrokerdomain/broker/sp/saml
    </saml2:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        ... XML Signature ...
    </ds:Signature>
    <saml2p:Status>
        <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </saml2p:Status>
    <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_f940b40421a7330f9b63e381bf8f1844"
                     IssueInstant="2021-03-09T15:42:11.914Z" Version="2.0">
        <saml2:Issuer>https://yourbrokerdomain/broker/sp/saml</saml2:Issuer>
        <saml2:Subject>
            <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
                          NameQualifier="https://was-preprod1.digid.nl/saml/idp/metadata">900026261
            </saml2:NameID>
            <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
                <saml2:SubjectConfirmationData InResponseTo="_900A8CD85314D6317FA8C61B49D021DA"
                                               NotOnOrAfter="2021-03-09T15:44:11.921Z"
                                               Recipient="https://yourspdomain"/>
            </saml2:SubjectConfirmation>
        </saml2:Subject>
        <saml2:Conditions NotBefore="2021-03-09T15:42:06.921Z" NotOnOrAfter="2021-03-09T15:44:11.921Z">
            <saml2:AudienceRestriction>
                <saml2:Audience>https://yourspdomain</saml2:Audience>
            </saml2:AudienceRestriction>
        </saml2:Conditions>
        <saml2:AttributeStatement>
            <saml2:Attribute Name="OriginalResponse">
                <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">
                    PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2FtbDpBc3NlcnRpb24geG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9Il84ZTdmZDIxMDYwNmMwNzc1ODZmMmE3Mjg0ZjhjM2ZjMDdhNjEzZmVkIiBJc3N1ZUluc3RhbnQ9IjIwMjEtMDMtMDlUMTU6NDI6MTFaIiBWZXJzaW9uPSIyLjAiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIj48c2FtbDpJc3N1ZXI+aHR0cHM6Ly93YXMtcHJlcHJvZDEuZGlnaWQubmwvc2FtbC9pZHAvbWV0YWRhdGE8L3NhbWw6SXNzdWVyPjxkczpTaWduYXR1cmU+PGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIvPjxkczpSZWZlcmVuY2UgVVJJPSIjXzhlN2ZkMjEwNjA2YzA3NzU4NmYyYTcyODRmOGMzZmMwN2E2MTNmZWQiPjxkczpUcmFuc2Zvcm1zPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPjxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9ImRzIHNhbWwgc2FtbHAgeHMiLz48L2RzOlRyYW5zZm9ybT48L2RzOlRyYW5zZm9ybXM+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPjxkczpEaWdlc3RWYWx1ZT55KzAxeGlFSmhXRS9zOGFXWW53bzM4clJhMzBKOW1oWVlnKzJBZnNFVDhnPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5FcHhUdGN1UFM3NXRYM1ZzWDQvaWd1RytoNzl3SGRFVTVjWFJJdHhaeDF6b2ZNeEkrQzBEUTdldnVzSU9TV1czK0lKNkd6SmNIWGRqdHJqUVA3OFpTdER1djZhWXdxbDUrU2M0cno5V2pWbkdCSlVUbnJLVHgzb2xxdkQzYVA1amVWUmhJVkk2TUYxVXExcG5pVXQxaDJNeG9RL0ZXZUlpUjg0RXU5Z3JrbzQ0ZDkvcGtEVy9taXA1bEIySUpTZWZzSzVtUmVTc3REZXJGWHg4L1B1ZnZTZ3NJTnIvVmNpQU1oUC91VzU4YU4vWFpOU0QrS0MvQkpGUDZsSU15UUwvMndwVU1xbkV5MERBYzUxNUNveXYvNDVoUWhJejdsZUR0SWtFd2Jid2VqRDlyNUFFcy9kbDhuQ3o4b3R5NFlyOXJKQ1N6U1U0ck51VE9xM0R1T0hXVkE9PTwvZHM6U2lnbmF0dXJlVmFsdWU+PGRzOktleUluZm8+PGRzOktleU5hbWU+OTRiZWMxMGM5ZDZiYzJhN2U4OGJlODNjZDgxZmRmNGRkMTUxMTI1MjwvZHM6S2V5TmFtZT48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlHZ0RDQ0JHaWdBd0lCQWdJVWVhSkNITjVXWXBBWW0zT2I5NUsrK3d1VUtGNHdEUVlKS29aSWh2Y04KQVFFTEJRQXdVekVMTUFrR0ExVUVCaE1DVGt3eEVUQVBCZ05WQkFvTUNFdFFUaUJDTGxZdU1URXdMd1lEClZRUUREQ2hMVUU0Z1VFdEpiM1psY21obGFXUWdVSEpwZG1GMFpTQlRaWEoyYVdObGN5QkRRU0F0SUVjeApNQjRYRFRJd01URXdOREUxTURVeE1Gb1hEVEl6TVRFd05ERTFNRFV4TUZvd2dZWXhDekFKQmdOVkJBWVQKQWs1TU1SRXdEd1lEVlFRSERBaEVaVzRnU0dGaFp6RVBNQTBHQTFVRUNnd0dURzluYVhWek1STXdFUVlEClZRUUxEQXBCWm1RdUlFUnBaMmxFTVIwd0d3WURWUVFGRXhRd01EQXdNREF3TkRFMk5qa3dPVGt4TXpBdwpNREVmTUIwR0ExVUVBd3dXYzJGdGJDMXphV2R1TG5Cd01TNWthV2RwWkM1dWJEQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNajhrS2RvbzF0MDdORmkrRE1QKzg0RW9SZzlza3FmCm9pQXBiKzhJd1JJcFZqZUN1NnRZOVlzby9KYzlsbVBsekxkUkRLVE9qS2M3L3Rhc3dDTHYxaytpVXZOYQpoNXkwTWgzTURvVFdwMytRY1VxaW0wZUxuNmRVTU55TXFQME1RTHFJWFRoekVUVTVGeW5iYlR2Mjd2eFcKdHFKZFdQaWx2OUU5K04xOSt2cFJNZ2JpWjVtSWFyZmhBdXZlaWkxK21HQTlZWkYyak1zRG1mYW5KNEwwCnBMNE1KUjQ0RkNiczJjZTFuOTZZTmhaaVoxWGh0NVk0NmpYWHZwUWtIRnhXRGJBR2Fra21uQ2k4ejlEMApCQkVZUTJNY2VZejJkQndxd0R0WUZnV3E4OVhmTVhPazhOWjdyNjV4dTlHSjU2TzJ2M2xjSHF2d0RQWGYKZ3pZVjFnWDZwcjBDQXdFQUFhT0NBaFl3Z2dJU01Bd0dBMVVkRXdFQi93UUNNQUF3SHdZRFZSMGpCQmd3CkZvQVV1TlJNbjZoYmJ0b2xwMmlPNzR4R0d2NGZVMlV3T0FZSUt3WUJCUVVIQVFFRUxEQXFNQ2dHQ0NzRwpBUVVGQnpBQmhoeG9kSFJ3T2k4dmNISnZZM053TG0xaGJtRm5aV1J3YTJrdVkyOXRNQ0VHQTFVZEVRUWEKTUJpQ0ZuTmhiV3d0YzJsbmJpNXdjREV1WkdsbmFXUXVibXd3Z2RjR0ExVWRJQVNCenpDQnpEQ0J5UVlLCllJUVFBWWRyQVFJSUJqQ0J1akJDQmdnckJnRUZCUWNDQVJZMmFIUjBjSE02THk5alpYSjBhV1pwWTJGaApkQzVyY0c0dVkyOXRMMlZzWld0MGNtOXVhWE5qYUdVdGIzQnpiR0ZuY0d4aFlYUnpNSFFHQ0NzR0FRVUYKQndJQ01HZ01aazl3SUdScGRDQmpaWEowYVdacFkyRmhkQ0JwY3lCb1pYUWdRMUJUSUZCTFNXOTJaWEpvClpXbGtJRkJ5YVhaaGRHVWdVMlZ5ZG1salpYTWdVMlZ5ZG1WeUlHTmxjblJwWm1sallYUmxiaUIyWVc0ZwpTMUJPSUhaaGJpQjBiMlZ3WVhOemFXNW5MakFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUIKQlFVSEF3RXdYQVlEVlIwZkJGVXdVekJSb0UrZ1RZWkxhSFIwY0RvdkwyTnliQzV0WVc1aFoyVmtjR3RwCkxtTnZiUzlMVUU1Q1ZsQkxTVzkyWlhKb1pXbGtVSEpwZG1GMFpWTmxjblpwWTJWelEwRkhNUzlNWVhSbApjM1JEVWt3dVkzSnNNQjBHQTFVZERnUVdCQlNkZ25wcnp2REhmQWJYOWlJNmRiQWpQVmxaTmpBT0JnTlYKSFE4QkFmOEVCQU1DQmFBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFCc1hJQVJCSGpBbng1dThTMVdjCjdybXQxOGx6ZHZkMUJkUVJvZ1NtQ3YyclZvUnJ5SnZLczNqMlhhRkpGTHZ6L0phSEkxdlRobmEzMS8yeApqR2xJVEc4ZTFYeDRwRGZ0WFlwdW1iV3BScTNVQVYrWmN2UDhVYTF2TFlPTjFSWSthOUVtYVFBOElUWE8KSzNhdjVSTW52M3VEb0h0Q2RCdnNCT0NabVphV1REZjRnbjhqWFdpcnlhbGt3ZUdFZXJiMDFRcGFPYTJ3CkJjNnJUZW5WSEE5R0s4UmIxQ0tWbmVxOHBKZFM4TmE3V0ZCalUxWnpxMjhMb3I0ZEVSSlhURzVRS1ROVwpDNEI1OHN0b2tEaW9nd2tWaGpiMjdVeTBzQ0puNXdOOTdPbVVSMlliUUhGSjlkbS9rcE5GK1B2M0tRekEKcjRGQkxmMUYzMzJaVVVFeGg5TGh3UGRtalFyOHZIcFA1Y0xmNldIc0VGQVpqN3M3U0xNbitybDl2WHp1Ck1LVXAwRWF1QjVjQjFUUHduclVKRTNCb0t6aS9GVUYyM1RHb1RXZnFqbFZmZ0NlR2MyL1JSY3BaVWxyTApTZ3BmRHBFNXAyTkltVUo2anFQc200L3RMWUc2Z1AxY0dEM3JObEVaeEV1RmVPRkh4L2dPVVRjQ0R4Y2cKTmRvbHJmRCtlZldwZHErWk1SdWd2aTVFZGoxUUFEYTRkNGVocnd4L0VJUUFBZ2hhcWxKTnN2S3hHLzFCCnJ5cmx6RHJKM3hyVnVYVEpFV2ZxM0VhK00xM2RFRFh2bmM1bmhRdDdnUFkwUzB5YnpCL01IbG1qQmZGTApmWHErZXVoUXRJWkRLNGJXaE5rbkI5MU15TkluWC9MQzJOeXdWNDdUUGZsdEY5TW5xT2ErWHVFeFhDWGgKdGErRAo8L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48c2FtbDpTdWJqZWN0PjxzYW1sOk5hbWVJRD5zMDAwMDAwMDA6OTAwMDI2MjYxPC9zYW1sOk5hbWVJRD48c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgSW5SZXNwb25zZVRvPSJfY2MxOWUyNDE0OGNlZDA3OTg3MWEwYTJlMDg4ZGZlNmEiIE5vdE9uT3JBZnRlcj0iMjAyMS0wMy0wOVQxNTo0NDoxMVoiIFJlY2lwaWVudD0iaHR0cHM6Ly9wa2lvLmJyb2tlci5uZy10ZXN0Lm5sL2Jyb2tlci9hdXRobi9kaWdpZC9hY3MiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAyMS0wMy0wOVQxNTo0MDoxMVoiIE5vdE9uT3JBZnRlcj0iMjAyMS0wMy0wOVQxNTo0NDoxMVoiPjxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PHNhbWw6QXVkaWVuY2U+aHR0cHM6Ly9wa2lvLmJyb2tlci5uZy10ZXN0Lm5sL2Jyb2tlci9hdXRobi9kaWdpZDwvc2FtbDpBdWRpZW5jZT48L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48L3NhbWw6Q29uZGl0aW9ucz48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMjEtMDMtMDlUMTU6NDI6MTFaIiBTZXNzaW9uSW5kZXg9IjA2MGI4YTc0Njg1MTIxYTQ5YmY4ZDI3YjQ3Nzc4ZjY0NzU4NTEyMyI+PHNhbWw6U3ViamVjdExvY2FsaXR5IEFkZHJlc3M9Ijc3LjI0OC4yMjcuMTgzIi8+PHNhbWw6QXV0aG5Db250ZXh0PjxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlNtYXJ0Y2FyZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5Db250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48L3NhbWw6QXNzZXJ0aW9uPg==
                </saml2:AttributeValue>
            </saml2:Attribute>
        </saml2:AttributeStatement>
        <saml2:AuthnStatement AuthnInstant="2021-03-09T15:42:11.921Z"
                              SessionIndex="add33efd-9f37-48b2-a8a2-d6346c539307">
            <saml2:AuthnContext>
                <saml2:AuthnContextClassRef>urn:etoegang:core:assurance-class:loa3</saml2:AuthnContextClassRef>
                <saml2:AuthenticatingAuthority>https://was-preprod1.digid.nl/saml/idp/metadata
                </saml2:AuthenticatingAuthority>
            </saml2:AuthnContext>
        </saml2:AuthnStatement>
    </saml2:Assertion>
</saml2p:Response>

SAML ํŠธ๋Ÿฌ์ŠคํŠธ(Trust)

IdP์™€ SP ๊ฐ„์˜ ๊ณต์œ  ๊ตฌ์„ฑ์œผ๋กœ, ํ†ต์‹  ์ค‘์— ๊ฐ์ž๊ฐ€ ์„œ๋กœ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์ฆ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋น„์ €๋‹

ID ์ œ๊ณต์ž๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง„์‹ค์˜ ์›์ฒœ์ž…๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์„œ๋น„์Šค ์ œ๊ณต์ž์— ๋ณด๊ด€๋œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋œ ์ •๋ณด๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ ์‹œ ํ”„๋กœ๋น„์ €๋‹(Just-in-time provisioning) ๊ณผ ์‹ค์‹œ๊ฐ„ ํ”„๋กœ๋น„์ €๋‹(real-time provisioning) ์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ์‹œ ํ”„๋กœ๋น„์ €๋‹: ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๊ณ  ์ธ์ฆํ•œ ๊ณ„์ •์ด ๋‚ด๋ถ€์— ์—†๋Š” ๊ฒฝ์šฐ, JIT๊ฐ€ ์ž‘๋™ํ•˜์—ฌ ์ƒˆ ๊ณ„์ •์„ ํ”„๋กœ๋น„์ €๋‹ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ํ”„๋กœ๋น„์ €๋‹: ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. IdP ์ธก์—์„œ ๊ณ„์ •์ด ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ๋˜๋ฉด ํ•ด๋‹น SP์— ํ›„์† ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ ธ ๊ณ„์ •์„ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์•ก์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(Metadata)

IdP์™€ SP๊ฐ€ ์Šค์Šค๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์œ  XML ๊ตฌ์„ฑ ์ฒญ์‚ฌ์ง„. ์ธ์ฆ์„œ๋„ ์—ฌ๊ธฐ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

<ds:NameIDFormat>urn:oasis:names:tc:saml:1.1:nameid-format:unspecified</ds:NameIDFormat>
<ds:NameIDFormat>urn:oasis:names:tc:saml:1.1:nameid-format:emailaddress</ds:NameIDFormat>

<ds:X509Certificate>ABCDEFG</ds:X509Certificate>

์ตœ์•ฝ์ 

SAML์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์•ฝ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž˜๋ชป๋œ ์–ด์„ค์…˜ ๊ฒ€์ฆ
  • ๋น„์ „ํ†ต XML ํŒŒ์„œ(parser)

SAML์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • XML ๊ตฌ๋ฌธ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ํ™”๋œ(canonicalized) SAML์„ ์‚ฌ์šฉํ•˜์„ธ์š”
  • XML โ€‹โ€‹์‘๋‹ต์—์„œ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ
  • XML โ€‹โ€‹์‘๋‹ต์—์„œ ๋ชจ๋“  ์„œ๋ช… ๊ฒ€์ฆ
  • ํ—ˆ์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œํ•œ
    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
  • SSL (HTTPS)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”
  • ๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ฆ ์ฐฝ ์ ์šฉ
  • ๊ธฐ๋ก ์บ์‹œ ์ƒ์„ฑ
  • ๋ฒ„ํผ ํฌ๊ธฐ ์ œํ•œ

์ƒ์ถฉ๋˜๋Š” ์ฃผ์žฅ

์ผ๋ถ€ ์ถœ์ฒ˜์—์„œ๋Š” SAML์ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ชจ๋‘์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์„ ๋ถ€์ธํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด, SAML์€ ์ฃผ๋กœ SSO์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ IdP๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๊ณ  SP๋Š” ๋Œ€์‹  ๋‚ด๋ถ€์ ์œผ๋กœ ๊ถŒํ•œ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ง์ ‘ SAML ํ†ตํ•ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ™•์‹คํžˆ ๋งํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋„๊ตฌ

SAML ๊ฐœ๋ฐœ ํ•  ๋•Œ ์œ ์šฉํ•œ ๋„๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Security Assertion Markup Language.ย Wikipedia. Retrieved 2024, November 3 from https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language
Okta. Understanding SAML. Retrieved 2024, November 3 from https://developer.okta.com/docs/concepts/saml/
OktaDev. A Developer's Guide to SAML.https://www.youtube.com/watch?v=l-6QSEqDJPo
VMWare End-User Computing. SAML 2.0: Technical Overview.https://www.youtube.com/watch?v=SvppXbpv-5k
Oracle. What is Security Assertion Markup Language (SAML)? Retrieved 2024, November 3 from https://www.oracle.com/my/security/cloud-security/what-is-saml/
Auth0. SAML. Retrieved 2024, November 3 from https://auth0.com/docs/authenticate/protocols/saml
Lee. S.Y. ํ˜ธ๋‹ค๋‹ฅ ๊ณต๋ถ€ํ•ด๋ณด๋Š” SSO์™€ ์นœ๊ตฌ๋“ค (SAML, OAuth, OIDC).https://gruuuuu.github.io/security/ssofriends/
MindMajix. SAML In Okta | Components Of SAML | Concepts Of SAML Flow.https://www.youtube.com/watch?v=-2KL57GEzwM
ByteMonk. What is SAML? A Comprehensive Guide with Examples.https://www.youtube.com/watch?v=4ULlJEupV-I