[영구 보존] OAuth 2.0/OpenID Connect 시퀀스 요약

안녕하세요.
이 글은 kura 12일째 되는 글이다.
개발팀을 떠나 프로젝트와 서비스 관리 중심의 업무로 인코딩을 전혀 하지 않지만, 상위 공정에서 서열도를 잘 썼기 때문에 자신의 업무 효율을 높이는 의미를 담고 있으며, 이번에는 OAuth 2.0과 OpenID Connect의 서열도를 총결하고자 한다.
그림뿐만 아니라 플래닛UML 코드도 실었으니 여러분도 잘 활용해 주시기 바랍니다.
PlanetUML 정보
PlanetUML은 클래스맵과 시퀀스맵을 이용하여 소스를 그리는 도구입니다.큐타에서도 기사를 정리하는 사람이 많기 때문에 자세한 정보를 검색해 보세요.
필자는 아래 내용을 참고하여 VScode와 조합하여 제작하였다.PlanetUML 환경이 제작되지 않은 분들은 참고해주세요.
PlanetUML에 대한 구문은 다음을 참조하여 사용자정의합니다.
OAuth 2.0
Digital Identity 기술 학습회 #iddance 추가 캘린더에 정의된 OAuth 2.0의 시퀀스부터 요약합니다.
프로세스 설명은 AuthleteRFC 6749의 설명을 참조하십시오.
OAuth 2.0 Abstract Protocol Flow
먼저 @TakahikoKawasaki부터 시작된 개요에도 등장한 개념적 서열도다.
간단하네.상위 공사의 자료는 이 수준에서도 괜찮다.
OAuth 2.0 Abstract Protocol Flow(PlanetUML 소스 코드)
@startuml OAuth 2.0 Abstract Protocol Flow
autonumber
participant Client as C
actor "Resource \nOwner" as RO
participant "Authorization \nServer" as AS
participant "Resource \nServer" as RS

C -> RO: Authorization Request
RO -> C: Authorization Grant
C -> AS: Authorization Grant
AS -> C: Access Token
C -> RS: Access Token
RS -> C: Protected Resource
@enduml
OAuth 2.0 Authorization Code Grant
OAuth 2.0의 Grant Type 중 가장 활용되는 것은 Authorization Code Grant이다.
Authorization Code를 발행하여 Access Token을 취득하고 Resource Server에 액세스하기 전의 최소 절차를 기재합니다.
※ 그랜트 타입은 4가지 유형이 있으나 오옥스 2.0의 후계자 제정RFC 6749, 임플리시티 그랜트와 리소스 오우너 패스워드 크레덴셜 그랜트는 제외돼 이번에 게재되지 않습니다.
OAuth 2.0 Authorization Code Grant(PlanetUML 소스 코드)
@startuml OAuth 2.0 Authorization Code Grant
autonumber
actor "Resource\nOwner" as RO
participant Client as C
participant "User-Agent" as UA
participant "Authorization\nServer" as AS
participant "Resource\nServer" as RS

RO -> C:
C -> UA: Authorization Request\nClient Identifier & Redirection URI\n& State
UA -> AS:
AS -> UA: User authenticates & grants
UA -> RO:
RO -> UA:
UA -> AS:
AS -> UA: Authorization Code & State
UA -> C:
C -> C: Validates State
C -> AS: Access Token Request\nAuthorization Code & Redirection URI
AS -> C: Access Token
C -> RS: Protected Resource Request\nAccess Token
RS -> C: Protected Resource
@enduml
OAuth 2.0 Authorization Code Grant with Refresh Token
다음은 Authorization Code Grant에서 선택할 수 있는 Refresh Token의 발행과 Access Token의 업데이트 시퀀스입니다.
OAuth 2.0 Authorization Code Grant with Refresh Token(PlanetUML 소스)
@startuml OAuth 2.0 Authorization Code Grant with Refresh Token
autonumber
actor "Resource\nOwner" as RO
participant Client as C
participant "User-Agent" as UA
participant "Authorization\nServer" as AS
participant "Resource\nServer" as RS

RO -> C:
C -> UA: Authorization Request\nClient Identifier & Redirection URI\n& State
UA -> AS:
AS -> UA: User authenticates & grants
UA -> RO:
RO -> UA:
UA -> AS:
AS -> UA: Authorization Code & State
UA -> C:
C -> C: Validates State
C -> AS: Access Token Request\nAuthorization Code & Redirection URI
AS -> C: Access Token & Refresh Token

alt Valid Access Token
C -> RS: Protected Resource Request\nAccess Token
RS -> C: Protected Resource

else Refreshing an Expired Access Token
C -> RS: Protected Resource Request\nAccess Token
RS -> C: Invalid Token Error
C -> AS: New Access Token Request\nRefresh Token
AS -> C: Access Token & Optional Refresh Token
C -> RS: Protected Resource Request\nAccess Token
RS -> C: Protected Resource
end
@enduml
OAuth 2.0 Client Credentials Grant
사용자와의 상호작용이 없는 클라이언트와 Authorization Server 양측 간에 교환되는 클라이언트 크레디트 그랜트의 수요도 높기 때문에 여기에 기록한다.
OAuth 2.0 Center Credentials Grant(PlantUML 소스 코드)
@startuml OAuth 2.0 Client Credentials Grant
autonumber
participant Client as C
participant "Authorization\nServer" as AS
participant "Resource\nServer" as RS

C -> AS: Access Token Request\nClient Authentication
AS -> C: Access Token
C -> RS: Protected Resource Request\nAccess Token
RS -> C: Protected Resource
@enduml
OpenID Connect
OAuth 2.1에 정의된 OpenID Connect의 순서도 함께 요약됩니다.
저도 여러분들이 OpenID Connect Core 1.0선생님의 해설을 참고하시기를 바랍니다.
2015년에 정리한 필자의 서열도 자료도 13만 번 이상 방문했는데 무엇보다 여러분에게 도움이 됩니다.가능하면 이쪽도 참고해주세요.
OpenID Connect Abstract Protocol Flow
다음은 OpenID Connect의 순서도를 요약한 것입니다.먼저 @TakahikoKawasaki Overview에 기재된 개념적 프로세스입니다.
이것도 OAuth 2.0의 Abstract Protocol Flow와 마찬가지로 간단하다.시퀀스 맵에 등장하는 캐릭터는 오옥 2.0과 거의 같지만, 오옥 2.0의 정의 명칭과 달리 자료를 제작할 때는 주의가 필요하다.
OpenID Connect Abstract Protocol Flow(PlanetUML 소스 코드)
@startuml OpenID Connect Abstract Protocol Flow
autonumber
participant "RP\n(Client)" as RP
actor "End-User" as EU
participant "OP\n(OpenID Provider)" as OP

RP -> OP: Authentication Request
OP -> EU: Authentication & Authorization
EU -> OP:
OP -> RP: Authentication Response
RP -> OP: UserInfo Request
OP -> RP: UserInfo Response
@enduml
OpenID Connect Authorization Code Flow
OpenID Connect에서 가장 많이 이용되는 것은 Authorization Code Flow가 아닐까 싶습니다.
OpenID Connect는 사용자의 인증 결과를 IDToken의 형식으로 Center에 연합하기 때문에 최초의 요청도 Authentication Request입니다.
또한 Client에서 Authorization Server에서 반환된 ID Token을 확인하고 사용자 식별자를 체크 아웃하는 것도 잊지 마십시오.
※ OpenID Connect는 OAuth 2.0을 기반으로 하며, 앞서 설명한 바와 같이OpenID Connect Core 1.0 임플리시티 그랜트를 제외하기 위해 여기서도 절차를 생략합니다.
OpenID Connect Authorization Code Flow(PlanetUML 소스 코드)
@startuml OpenID Connect Authorization Code Flow
autonumber
actor "End-User" as EU
participant Client as C
participant "User-Agent" as UA
participant "Authorization\nServer" as AS
participant "Resource Server\nUserInfo Endpoint" as RS

EU -> C:
C -> UA: Authentication Request\nState & Nonce
UA -> AS:
AS -> UA: Authenticates End-User
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Obtains End-User Consent/Authorization
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Authorization Code & State
UA -> C:
C -> C: Validates State
C -> AS: Access Token Request\nAuthorization Code
AS -> C: ID Token & Access Token
C -> C: Validates ID Token(Nonce)\n& retrieves End-User's\nSubject Identifier
C -> RS: UserInfo Request\nAccess Token
RS -> C: UserInfo Response
@enduml
OpenID Connect Authorization Code Flow with Refresh Token
Refresh Token의 발행과 Access Token의 업데이트를 담은 시퀀스 그림도 기재돼 있다.
OpenID Connect Authorization Code Flowwith Refresh Token(PlanetUML 소스 코드)
@startuml OpenID Connect Authorization Code Flow with Refresh Token
autonumber
actor "End-User" as EU
participant Client as C
participant "User-Agent" as UA
participant "Authorization\nServer" as AS
participant "Resource Server\nUserInfo Endpoint" as RS

EU -> C:
C -> UA: Authentication Request\nState & Nonce
UA -> AS:
AS -> UA: Authenticates End-User
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Obtains End-User Consent/Authorization
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Authorization Code & State
UA -> C:
C -> C: Validates State
C -> AS: Access Token Request\nAuthorization Code
AS -> C: ID Token & Access Token & Refresh Token
C -> C: Validates ID Token(Nonce)\n& retrieves End-User's\nSubject Identifier

alt Valid Access Token
C -> RS: UserInfo Request\nAccess Token
RS -> C: UserInfo Response

else Refreshing an Expired Access Token
C -> RS: UserInfo Request\nAccess Token
RS -> C: Invalid Token Error
C -> AS: New Access Token Request\nRefresh Token
AS -> C: Access Token & Optional Refresh Token & Optional ID Token

alt if an ID Token is returned
C -> C: Validates ID Token
end

C -> RS: UserInfo Request\nAccess Token
RS -> C: UserInfo Response
end
@enduml
OpenID Connect Hybrid Flow with Refresh Token
Authorization Code Flow와 비교해 아이디톡신을 사용하는 경우는 적지만, 아이디톡신을 Detached Signature로 Authorization Code와 State의 변조검사 용도로 사용한 Hybrid Flow를 함께 정리할 수도 있다.
Refresh Token 발행과 Access Token 업데이트도 함께 기재됐다.
※ 앞서 설명한 바와 같이OAuth 2.1 임플리시티 그랜트를 제외하기 위해response_type에 포함된token 프로세스가 중단되었습니다.
OpenID Connect Hybrid Flow(PlanetUML 소스)
@startuml OpenID Connect Hybrid Flow with Refresh Token
autonumber
actor "End-User" as EU
participant Client as C
participant "User-Agent" as UA
participant "Authorization\nServer" as AS
participant "Resource Server\nUserInfo Endpoint" as RS

EU -> C:
C -> UA: Authentication Request\nState & Nonce
UA -> AS:
AS -> UA: Authenticates End-User
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Obtains End-User Consent/Authorization
UA -> EU:
EU -> UA:
UA -> AS:
AS -> UA: Authorization Code & State & ID Token
UA -> C:
C -> C: Validates State
C -> C: Validates ID Token(c_hash, Nonce)
C -> AS: Access Token Request\nAuthorization Code
AS -> C: ID Token & Access Token & Refresh Token
C -> C: Validates ID Token &\nretrieves End-User's\nSubject Identifier

alt Valid Access Token
C -> RS: UserInfo Request\nAccess Token
RS -> C: UserInfo Response

else Refreshing an Expired Access Token
C -> RS: UserInfo Request\nAccess Token
RS -> C: Invalid Token Error
C -> AS: New Access Token Request\nRefresh Token
AS -> C: Access Token & Optional Refresh Token & Optional ID Token

alt if an ID Token is returned
C -> C: Validates ID Token
end

C -> RS: UserInfo Request\nAccess Token
RS -> C: UserInfo Response
end
@enduml
최후
이번에는 OAuth 2.0 및 OpenID Connect의 순서도를 요약했습니다.
각 회사의 IdP와 합작(없을 수도 있음)하여 본사에서 인증, 서버 인정 등을 실시할 때 역할을 발휘할 수 있다면 좋겠습니다.
만약 기재 오류가 발견되면 기사에 댓글을 달아주시거나 아래 Giithub에도 PlanetUML의 원본 코드를 올려주시면 보내주시기 바랍니다.
18일째도 책임질 예정이니 기대해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기