인프런 커뮤니티 질문&답변

aanicall님의 프로필 이미지
aanicall

작성한 질문수

스프링 시큐리티 OAuth2

oidc userinfo 확인 시 오류가 납니다.

작성

·

204

0

안녕하세요. 강의 잘 보고 많은 부분 배워가고 있습니다.

강의 진행중 섹션 7의

OAuth2 로그인 구현 - Oauth 2.0 User 모델 소개(2)에서

뒷부분 oidc로 사용자 정보 조회하는 부분인데요.

 

@GetMapping("/oidc")
public OAuth2User oidc(String accessToken, String idToken)
{
    ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("keycloak");
    OAuth2AccessToken oAuth2AccessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, accessToken, Instant.now(), Instant.MAX);

    Map<String, Object> idTokenClaims = new HashMap<>();
    idTokenClaims.put(IdTokenClaimNames.ISS, "http://localhost:9091/realms/oauth2");
    idTokenClaims.put(IdTokenClaimNames.SUB, "OIDC0");
    idTokenClaims.put("preferred_username", "userpww");

    OidcIdToken oidcIdToken = new OidcIdToken(idToken, Instant.now(), Instant.MAX, idTokenClaims);

    OidcUserRequest oAuth2UserRequest = new OidcUserRequest(clientRegistration, oAuth2AccessToken, oidcIdToken);
    OidcUserService oidcUserService = new OidcUserService();
    OAuth2User oAuth2User = oidcUserService.loadUser(oAuth2UserRequest);

    return oAuth2User;
}

oidcUserService.loadUser(oAuth2UserRequest); 이 부분이 실행될 때

loadUser 메서드 내부의

if (!userInfo.getSubject().equals(userRequest.getIdToken().getSubject())) {
          OAuth2Error oauth2Error = new OAuth2Error(INVALID_USER_INFO_RESPONSE_ERROR_CODE);
          throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString());
       }

이 부분을 타면서 예외가 발생합니다. 어떤 부분을 확인해 봐야 할까요?

userInfo의 sub와

userRequest의 sub가 달라서 그런걸까요?

읽어주셔서 감사합니다.

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

정확하게 오류메시지가 어떻게 출력되는가요?

sub 을 OIDC0 을 제외하고 실행해 보시기 바랍니다.

0

안녕하세요, 인프런 AI 인턴입니다.

oidcUserService.loadUser 메서드에서 예외가 발생하는 이유는 userInfosub 값과 userRequest의 idToken에서 추출한 sub 값이 다르기 때문인 것으로 보입니다. UserInfo의 sub 값과 idToken의 sub 값은 같아야 정상적으로 인증 처리가 진행됩니다. 이 문제를 해결하기 위해 다음 점을 확인해보세요.

  1. idTokenClaims에 설정한 sub 값이 실제로 ID Token 발급자(예: 인증 서버)에 의해 발급된 ID Token의 sub 값과 정확히 일치하는지 확인하세요. sub 값은 사용자를 식별하는 고유한 식별자이므로, 이 값이 일치하지 않으면 인증 과정에서 오류가 발생할 수 있습니다.

  2. ClientRegistration에서 설정한 issuer-uri 값이 실제 ID Token 발급자의 issuer 값과 일치하는지 확인하세요. 만약 issuer-uri 설정이 잘못되어 있거나, issuer 값이 예상과 다르게 설정되어 있다면, ID Token 검증 과정에서 문제가 발생할 수 있습니다.

  3. OAuth2UserRequest 생성 시 사용되는 clientRegistration 정보가 올바른지 확인하세요. findByRegistrationId("keycloak")으로 검색한 ClientRegistration 정보가 실제로 사용하려는 OAuth2 클라이언트 설정과 일치하는지 점검해보는 것이 중요합니다.

  4. Debugging을 통해 idTokenClaims나 OidcIdToken 객체가 올바르게 생성되었는지, OidcUserRequest 생성 과정에서 예상대로 동작하는지 상세하게 확인해보세요.

이러한 점검을 통해 문제의 원인을 좁혀나가다 보면, 예외 처리의 정확한 원인을 파악하고 해결 방안을 찾을 수 있을 것입니다.

aanicall님의 프로필 이미지
aanicall

작성한 질문수

질문하기