Open ID Connect 에 대해서 공부하면서 이것저것 찾아본것을 정리해 보았다.
1. OpenID Connect 란?
- OpenID Connect 는 Oauth 2.0을 확장해서 개발 되었다.
- OpenID Connect 는 openid라는 scope 값을 포함해서 Authorization Request를 보내며 인증(Authentication) 에 대한 정보는 ID Token 이라고 불리는 JSON Web Token(JWT) 을 리턴해준다. (scope에 openid 를 무조건 포함해야 하는지는 좀 헷갈린다.. )
- OpenID Provider (OP) : End-User 를 인증하고 인증이벤트 및 End-User에 대한 당사지에게 클레임을 제공할수 있는 Oauth 2.0 인증서버 (원문 : OAuth 2.0 Authorization Server that is capable of Authenticating the End-User and providing Claims to a Relying Party about the Authentication event and the End-User. )
2. ID Token
- ID Token 은 End-User의 인증에 대한 Claims 를 담고 있는 암호화 된 토큰이다. ID Token 은 JSON Web Token(JWT) 로 표현된다.
타입 |
필수여부 |
설명 |
iss |
Required |
ID Token 발급에 대한 고유 식별값. host, port 등이 포함되기도 한다. |
sub | Required | End-User 에 대한 고유한 값 |
aud | Required | ID Token 과 관련된 청중, client_id 와 관련이 있다. |
exp | Required | 토큰 만료 시간 |
iat | Required | JWT 를 발행한 시간 |
auth_time | Required/Optional | End-User에 대한 인증이 일어난 시간. |
nonce | | |
acr | Optional | Authentication Context Class Reference. |
amr | Optional | Authentication Method Reference. |
azp |
Optional |
Authorized Party. |
Json
Object 예시
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr":
"urn:mace:incommon:iap:silver"
}
3. OpenID Connect Authentication Flow
OepnID Connect Authentication 흐름에는 3가지 종류가 있다.
- Authorization Code Flow
- Implicit Flow
- Hybrid Flow
우선 이 흐름을 설명하기 전에 아래 표를 먼저 살펴보자.
Property |
Authorization Code Flow |
Implicit Flow |
Hybrid Flow |
All tokens returned from Authorization Endpoint |
NO |
YES |
NO |
All tokens returned from Token Endpoint |
YES |
NO |
NO |
Tokens not revealed to User Agent |
YES |
NO |
NO |
Client can be authenticated |
YES |
NO |
YES |
Refresh Token possible |
YES |
NO |
YES |
Communication in one round trip |
NO |
YES |
NO |
Most communication server-to-server |
YES |
NO |
VARIES |
무슨말인지 이해가 안될지도 모르지만 우선 내 생각이 이거 2가지만 기억하면 좋을것 같다.
#1 All tokens returned from Authorization Endpoint : token 발급 위치에 대한 내용이다. Oauth 2.0 이나 OpenID Connect 나 정의 되어있는 URL 을 보면 끝에 authorize 로 끝나는 URL 이 있다. (아닐수도 있지만 보통 비슷하다) 이 URL 이 바로 Authorization Endpoint 이다. 먼저 인증이 되었는지 안되었는지 확일을 하는 URL 이고 이 URL 의 응답에 따라서 client 에서는 로그인 창으로 리다이렉트 되기도 한다. 이 값이 NO 라는 말은 Token 발급 Endpoint 가 아니라는 의미이다. 뒤에 또 설명을 하겠지만 간단히 설명하면 Authorization Code 방식은 Authorization Endpoint 에서 인증이 확인되면 Code를 발급하고 그 Code 를 가지고 Token Endpoint로 요청을 해서 Token을 발급받는다.
#2 All tokens returned from Token Endpoint : URL 이 accessToken 또는 token 이렇게 끝나는 URL 이다. Implicit Flow 같은 경우는 이미 Authorization Endpoint 에서 Token을 발급하기 때문에 Token Endpoint 가 필요 없다.
4. Response_type
위에서 잠깐 언급한 3가지의 Flow는 Authorization
Request 에 response_type 의 값에 따라서 결정된다. response_type 은 필수 값이다.
response_type value
|
Flow
|
code
|
Authorization Code
|
id_token
|
Implicit
|
id_token token
|
Implicit
|
code id_token
|
Hybrid
|
code token
|
Hybrid
|
code id_token token
|
Hybrid
|
각각의 흐름에 대한 특징들은 다음 글에서 다시 설명하겠다.
참고자료
https://connect2id.com/learn/openid-connect
http://openid.net/specs/openid-connect-core-1_0.html#IDToken
https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660