OAUTH CALLBACK

OAuth state code 검증

소셜 로그인 버튼을 누른 뒤 콜백을 받는 장면만 보면 OAuth가 단순해 보인다. 실제로는 state로 CSRF를 막고, authorization code를 서버에서 토큰으로 교환하며, provider 계정과 내부 사용자를 안전하게 연결해야 한다.

state 검증 시작 시 저장한 난수와 콜백 state가 다르면 즉시 거부한다
서버 교환 authorization code는 서버에서 provider token으로 바꾼다
계정 연결 provider id와 email 검증 상태로 내부 사용자 매핑을 결정한다
01

로그인 시작

provider authorization URL을 만들고 state와 redirect_uri를 서버 정책에 맞게 저장한다.

redirect_uri 불일치는 provider가 즉시 거부한다
02

사용자 승인

사용자는 provider에서 권한 범위와 계정을 선택한다.

scope는 최소한으로 요청한다
03

콜백 검증

code가 왔는지, state가 저장값과 같은지, error 파라미터가 있는지 먼저 확인한다.

state 실패는 인증 시도로 처리하지 않는다
04

토큰 교환

서버가 code를 access token으로 교환하고 provider profile을 조회한다.

브라우저에 client secret을 노출하지 않는다
05

계정 연결

provider id, email 검증 상태, 기존 계정 병합 정책에 따라 내부 사용자를 찾거나 만든다.

email만 믿고 자동 병합하면 계정 탈취 위험이 있다
state
요청 위조 방지 시작 시 저장한 난수와 콜백 값을 비교해 흐름을 묶는다.
불일치는 즉시 거부한다
code
일회성 교환값 서버에서 provider token endpoint로 교환하고 재사용을 허용하지 않는다.
만료와 중복 사용 실패를 처리한다
provider error
사용자 취소와 장애 access_denied, invalid_scope, server_error를 로그인 실패와 구분한다.
사용자 취소는 보안 경고가 아니다
account link
내부 사용자 매핑 provider id를 우선 키로 두고 email 병합은 검증 상태와 정책을 본다.
동일 email이 항상 동일 사람은 아니다

콜백 확인

state 변조 저장값과 다른 state로 콜백을 호출해 거부되는지 확인한다.
provider 실패 사용자 취소, scope 거부, code 만료 응답이 각각 적절히 처리되는지 본다.
계정 연결 기존 계정, 신규 계정, 같은 email 다른 provider 사례를 분리 테스트한다.