OAuth2는 제3자 애플리케이션에 제한된 접근 권한을 위임하는 프레임워크이고, 로그인에서 사용자 인증 결과를 검증하려면 OIDC의 ID Token과 issuer/audience/nonce 검증이 필요하다.
Authorization Code Flow는 code를 브라우저 front channel로 받고 token은 서버 back channel에서 교환한다. 이때 state, redirect_uri, PKCE code_verifier가 flow 탈취와 혼동을 줄이는 핵심 경계다.
Social Login은 “같은 이메일”로 자동 연결하면 위험하다. provider, provider subject, email_verified, 기존 세션 재인증, 연결/해제 감사 로그를 함께 봐야 한다.
핵심 정리
OAuth2의 역할은 Resource Owner, Client, Authorization Server, Resource Server다. 우리 Spring 애플리케이션이 어느 역할인지 먼저 정해야 검증 위치가 보인다.
Authorization code는 짧게 한 번만 사용되는 임시 값이다. 로그, URL history, referer, analytics에 남지 않게 다뤄야 한다.
state는 로그인 요청과 callback을 묶어 CSRF와 flow 혼동을 줄인다. PKCE는 code를 훔쳐도 code_verifier 없이는 token 교환을 어렵게 만든다.
Redirect URI는 prefix match나 wildcard보다 등록된 URI의 정확한 매칭이 안전하다.
ID Token은 access token이 아니다. ID Token은 인증 결과이고 access token은 Resource Server 접근 권한이다.
UserInfo 응답과 이메일은 내부 권한이 아니다. 내부 계정과 연결할 때는 provider subject를 안정 식별자로 저장한다.
Provider access token과 refresh token은 secret이다. 저장, 암호화, scope 축소, 회전, 폐기, 로그 마스킹이 운영 설계에 포함되어야 한다.
하위 문서 연결
OAuth2 역할과 Authorization Code Flow: OAuth2 역할과 front channel/back channel을 구분하고 code flow의 검증 지점을 잡는다.
PKCE State Redirect URI 보안: state, PKCE, redirect URI 정확 매칭으로 code injection과 callback 혼동을 막는다.
OIDC ID Token과 UserInfo: ID Token claim 검증과 UserInfo subject 일치를 통해 인증 결과를 확인한다.
Social Login 계정 연결 위험: provider subject 기반 연결, 재인증, 알림, 감사 로그로 계정 탈취 위험을 낮춘다.
Token 교환 저장 갱신 운영: authorization code, provider token, refresh token을 secret으로 저장하고 갱신 실패를 운영 이벤트로 다룬다.
헷갈리는 지점
OAuth2 로그인을 쓰면 자동으로 OIDC 인증이 된다고 생각하기 쉽다.
openid scope, ID Token 검증, issuer/audience/nonce 검증이 실제 로그인 안전성을 만든다.
단순 OAuth2 profile API 호출만으로 내부 사용자 인증을 확정하면 provider별 차이를 놓친다.