[BE] feat: OpenID Connect 방식의 인증 기능 추가 (#909) #910
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📌 관련 이슈
✨ PR 세부 내용
OpenID Connect 방식의 인증 기능을 추가했습니다.
사용자는 OAuth2로 인증을 수행하고,
accessToken
을 서버로 보내지 않고idToken
을 서버로 보냅니다.idToken
은 JWT 토큰 형식으로, 모든 정보가 노출되어 있는데, 이걸로 어떻게 신원을 검사하냐면, OAuth2 서버에서 비밀키로 서명된 JWT 토큰을 OAuth2 서버에 공개키를 요청하여, 서버에서 해당 공개키로 IdToken이 수정되지 않은 토큰임을 검사합니다.따라서 악의적으로 토큰을 수정해서 보내더라도, 서버에서 해당 토큰이 수정되었는지 판단할 수 있으므로 보안에 문제가 없습니다!
카카오에서 제공하는 OpenID 유효성 검증 절차는 다음과 같습니다.
서명 검증은 다음 순서로 진행합니다.
3.1 공개키는 일정 기간 캐싱(Caching)하여 사용할 것을 권장하며, 지나치게 빈번한 요청 시 요청이 차단될 수 있으므로 유의
5.1 참고: OpenID Foundation, jwt.io
5.2 라이브러리를 사용하지 않고 직접 서명 검증 구현 시, RFC7515 규격에 따라 서명 검증 과정 진행 가능
여기서 3, 4, 5, 6, 서명 검증 과정은
KakaoOpenIdUserInfoProvider
에 구현되어 있으니 참고하시면 될 것 같습니다.(6 과정은 시간 상의 이유로 생략했습니다. 추후 구현이 필요합니다)
서명 검증을 진행할 때, 공개키 목록을 매번 조회하면 요청이 차단될 수 있으므로
CachedOpenIdKeyProvider
를 통해 캐싱을 하였습니다.라이브러리 캐시를 사용한 것이 아닌, 직접 캐시를 구현하여 동시성 문제를 처리하는 코드가 포함되어 있으므로 약간 지저분 합니다. 😂
ConcurrentHashMap
을 사용하는 방법도 있는데,computeIfAbsent
의 2번째 매개변수인 매핑 함수에 현재 상태를 변경하면 안 된다는 규칙이 있어서, 직접 동시성 문제를 처리할 수 밖에 없었네요. 😂