Oidc를 통한 로그인 질문합니다

안녕하세요.

OIDC를 통해 소셜 로그인을 구현하려고 합니다.

궁금한 점은, 자사 서비스 내 백앤드에서 받은 id토큰을 따로 서명 검증을 해야하는게 필수적인가요?

아니면, id토큰의 서명이나 페이로드 검증 없이 그냥 자사DB 내 등록된 유저인지 아닌지만 검증하여(페이로드에서 사용자 정보 추출) 로그인하거나 회원가입 처리를 해도 되는건가요?

안녕하세요.

OpenID Connect 사용 시 ID 토큰 재생 공격을 방지하기 위해 nonce 파라미터 사용을 권장합니다.

OpenID Connect를 통해 ID 토큰을 함께 발급받을 경우, ID 토큰 재생 공격을 방지하기 위해 사용합니다. ID 토큰 유효성 검증 시 대조할 고유한 난수 값을 nonce 파라미터로 전달합니다.

2.5. nonce 파라미터 사용 Kakao Developers

nonce값을 통한 검증은 추가한 상태입니다.

nonce값을 통한 검증을 포함하여 payload 검증(aud, exp, iss 확인)을 한다면, id토큰의 signature에 대한 검증(공개키를 통한 검증)없이 회원가입이나 로그인 처리를 해도 된다고 이해하면 될까요?

인가코드 요청 시, 백엔드에 세션ID나 키해시 전달하며 발급받은 nonce 값을 pair로 세팅하고

리다이렉트 URI에 인가코드 받아
백엔드에서 ID토큰 발급 받으며 nonce 값 검증하고 nonce와 payload 서버 캐싱하여 사용시 마다 nonce와 payload 값 검증하면 토큰 발급과 사용사이에 외부 개입할 여지가 없어보이는데요.

페이로드 검증은 어떻게 하실 생각이셨나요?


가이드에서는 서명 검증도 하도록 안내하고 있습니다.

이해하기 | Kakao Developers 이해하기

3. ID 토큰 유효성 검증하기

ID 토큰은 제 3자인 카카오 인증 서버에서 발급하므로, 서비스 보안을 위해 유효한 ID 토큰인지 검증하고 사용해야 합니다. 다음 순서로 ID 토큰을 검증합니다. 페이로드 값 확인 시, 필요에 따라 디버깅 목적으로 제공되는 ID 토큰 정보 보기 API를 사용할 수 있습니다.

  1. ID 토큰의 영역 구분자인 온점(.)을 기준으로 헤더, 페이로드, 서명을 분리
  2. 페이로드를 Base64 방식으로 디코딩
  3. 페이로드의 iss 값이 https://kauth.kakao.com와 일치하는지 확인
  4. 페이로드의 aud 값이 서비스 앱 키와 일치하는지 확인
  5. 페이로드의 exp 값이 현재 UNIX 타임스탬프(Timestamp)보다 큰 값인지 확인(ID 토큰이 만료되지 않았는지 확인)
  6. 페이로드의 nonce 값이 카카오 로그인 요청 시 전달한 값과 일치하는지 확인
  7. 서명 검증

서명 검증은 다음 순서로 진행합니다.

  1. 헤더를 Base64 방식으로 디코딩
  2. OIDC: 공개키 목록 조회하기를 통해 카카오 인증 서버가 서명 시 사용하는 공개키 목록 조회
  3. 공개키 목록에서 헤더의 kid에 해당하는 공개키 값 확인
  • 공개키는 일정 기간 캐싱(Caching)하여 사용할 것을 권장하며, 지나치게 빈번한 요청 시 요청이 차단될 수 있으므로 유의
  1. JWT 서명 검증을 지원하는 라이브러리를 사용해 공개키로 서명 검증
  • 참고: OpenID Foundation, jwt.io
  • 라이브러리를 사용하지 않고 직접 서명 검증 구현 시, RFC7515 규격에 따라 서명 검증 과정 진행 가능

보내주신 ID 토큰 유효성 검증하기에서 페이로드 검증 가이드를 따라 검증하고 있습니다!

1개의 좋아요