OpenID Connect(OIDC)는 OAuth 2.0 위에 구축된 인증 레이어로, ID 토큰(JWT)을 통해 사용자 신원을 검증한다. 소셜 로그인, SPA, 모바일 앱 인증의 사실상 표준이다.
OAuth 2.0과 OIDC 관계
OAuth 2.0: 인가(Authorization) 프레임워크
└─ OIDC: OAuth 2.0 + 인증(Authentication) 레이어
OIDC 추가 요소:
- ID Token (JWT): 사용자 신원 정보
- UserInfo Endpoint: 추가 사용자 정보
- Discovery Document: /.well-known/openid-configuration
- PKCE: 코드 교환 증명 (모바일/SPA 필수)
OIDC 플로우 비교
| 플로우 | 용도 | ID Token 위치 |
|---|
| Authorization Code | 서버 웹앱 | 토큰 엔드포인트 응답 |
| Authorization Code + PKCE | SPA/모바일 | 토큰 엔드포인트 응답 |
| Implicit (권장X) | 레거시 SPA | 리다이렉트 URL 파라미터 |
| Client Credentials | 서버간 통신 | ID Token 없음 |
Authorization Code + PKCE 흐름
1. 클라이언트: code_verifier 생성 (랜덤 43-128자)
code_challenge = BASE64URL(SHA256(code_verifier))
2. GET /authorize?
response_type=code
&client_id=app123
&redirect_uri=https://app.example.com/callback
&scope=openid email profile
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256
&state=random_state
&nonce=random_nonce
3. 사용자 인증 후 → code 반환
4. POST /token
code=AUTH_CODE
&code_verifier=원본_검증값
→ access_token, id_token, refresh_token 반환
ID Token 구조 (JWT)
json
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"aud": "app123.apps.googleusercontent.com",
"exp": 1735689600,
"iat": 1735686000,
"nonce": "random_nonce",
"email": "user@example.com",
"email_verified": true,
"name": "홍길동",
"picture": "https://..."
}
검증 체크리스트
ID Token 검증:
✓ iss 값이 신뢰할 수 있는 발급자인지
✓ aud에 자신의 client_id 포함 여부
✓ exp 만료 시간 확인
✓ iat 발급 시간 허용 범위 확인
✓ nonce 일치 여부 (replay 방지)
✓ JWS 서명 검증 (JWKS URI에서 공개키 가져와 검증)
관련 문서