본문 바로가기

개발 노트/개발 삽질

[품앗이] JWK로 OAuth2 토큰 검증하기

728x90
반응형

2025.11.03 - [개발 노트/Experience] - 사이드 프로젝트 품앗이를 정리하며

JWK로 OAuth2 토큰 검증하기

품앗이의 로그인은 사용자 편의를 위한 카카오 로그인이다. 즉, OAuth2 방식인 셈이다. 카카오 로그인 구현과 관련된 내용은 내 블로그에서 이미 다룬 바 있어, 여기서는 생략한다.

 

늘 구현하던 카카오 로그인이지만, 이번에는 실제 사용자를 대상으로 했기 때문에 한 가지를 더 고민해야 했다. 바로 “프론트에서 전달되는 카카오 토큰을 믿을 수 있는가?”이다. 사실 API를 호출하는 주체는 프론트 측이기 때문에, 편의상 이를 프론트라고 부르겠다.

 

품앗이 프로젝트에서는 프론트에서 카카오 로그인 토큰을 받아 백엔드에 전달하면, 백엔드 API에서 사용할 수 있는 토큰으로 교환해주는 방식이다. 따라서 프론트가 전달하는 카카오 토큰을 무작정 신뢰할 수 있는지 여부가 중요한 문제였다.

 

이 문제를 해결하는 방법 중 하나가 JWK다.

> JWK
카카오가 제공하는 공개 키 정보를 담은 JSON 형식의 데이터로, ID 토큰이 진짜인지 안전하게 확인할 때 사용된다.

 

자연스럽게 코드를 작성하고 이를 정리하다 보니, 개발 과정이 다음과 같은 시퀀스로 진행되었음을 확인할 수 있었다.

 

 

위 시퀀스는 다음 흐름을 보여준다:

  1. 사용자가 카카오 로그인을 통해 ID 토큰을 발급받는다.
  2. 프론트에서 전달된 토큰을 백엔드 KakaoIdTokenVerifier가 검증한다.
  3. 캐시된 JWK가 없거나 만료된 경우, 카카오 서버에서 새 JWK를 받아 캐싱한다.
  4. 토큰 헤더에서 kid를 확인하고, JWK에서 해당 공개 키를 선택한다.
  5. 공개 키로 토큰을 디코딩하고 유효성을 검증한다.
  6. 토큰이 유효하면 사용자 정보를 반환하고, 유효하지 않으면 예외를 발생시킨다.
728x90
반응형