인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

신석균님의 프로필 이미지
신석균

작성한 질문수

스프링 시큐리티 OAuth2

Spring Authorization Server 을 OAuth Client Client 로 등록

해결된 질문

작성

·

1.4K

·

수정됨

0

Spring Authorization Server 1.x 와 OAuthClient 를 사용하고 있습니다.

강의 내용과 레퍼런스를 참조하여 Spring Authorization Server 사용하여 SSO 시스템을 개발을 진행하고 있습니다.

OAuth2 Client 등록등 관리자 화면 접속을 위하여 로그인 페이가 필요한데 개발중인 SSO 시스템을 OAuth2 Client 로 등록하여 인증처리를 하기 위하여 설정 파일에 provider 로 등록하였습니다.

spring:
  security:
    oauth2:
      client:
        registration:
          local:
            authorization-grant-type: authorization_code
            client-id: 'default'
            client-secret: '325ee4c4-94e9-435b-a3c4-579f84d1e211'
            client-name: '인증서버'
            redirect-uri: SSO서버URL/social-login/oauth2/code/naon-iam
            scope:
              - openid
              - profile
      
        provider:
          local:
            issuer-uri: SSO서버URL

문제는 Spring Boot 가 기동될떄 oauth2 client 설정이 초기화 되는 과자에서 issuer-uri 에 접속을 하는데 아직 WAS 가 실행이 안된 상태이기 때문에 issuer-uri 로 ODIC Provider 정보를 가져 올떄 Connection refused 예외가 발생합니다.

Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://SSO서버URL/.well-known/openid-configuration": Connection refused: no further information
	at org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:888) ~[spring-web-6.0.9.jar:6.0.9]
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:868) ~[spring-web-6.0.9.jar:6.0.9]
	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:714) ~[spring-web-6.0.9.jar:6.0.9]
	at org.springframework.security.oauth2.client.registration.ClientRegistrations.lambda$oidc$0(ClientRegistrations.java:163) ~[spring-security-oauth2-client-6.1.0.jar:6.1.0]
	at org.springframework.security.oauth2.client.registration.ClientRegistrations.getBuilder(ClientRegistrations.java:216) ~[spring-security-oauth2-client-6.1.0.jar:6.1.0]
	... 178 common frames omitted

yaml 의 설정을 제거 하고 Java Config 에서 등록을 하면

	@Bean
	public ClientRegistrationRepository clientRegistrationRepository() {
		return new InMemoryClientRegistrationRepository(this.localRegistration());
	}

	private ClientRegistration localRegistration() {
		return ClientRegistration.withRegistrationId("local")
			.clientId("google-client-id")

순한 참조 예외가 발생합니다.

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'clientRegistrationRepository': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:355) ~[spring-beans-6.0.9.jar:6.0.9]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:227) ~[spring-beans-6.0.9.jar:6.0.9]

Spring Authorization Sever 와 충돌의 의심해보았는데 RegisteredClientRepository 로 등록하거 있어 원인을 아닌거 같고 ClientRegistrationRepository 을 등록하는 코드에 문제가 있는거 같이 문의 합니다.

개발은 Spring Authorization 1.1 로 진행하고 있습니다. OIDC Logout Endpoint 기능이 필요하여 지난주에 Spring Authorization 1.0.2 -> 1.1 로 업그레이드 하였습니다.

 

 

 

답변 2

0

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

issuer-url 을 반드시 설정해야 하는 것은 아닙니다

issuer 는 초기화시 인증서버에서 설정한 메타 데이터를 검색해서 가져오기 위한 목적인데 클라이언트에서 인증서버와 요청하기 위한 항목들을 yml 에 설정했다면 issuer 이 없어도 정상동작은 합니다

다만 접속자체가 안되는 부분은 별도의 문제입니다

인가서버에서 접속을 거부했거나 클라이언트에서 아예 막혀 있거나 하는 부분일 수 있습니다

참고로 저 역시 위와 비슷한 상황을 겪었는데 내부망에 있는 WAS 에서 외부망에 있는 인가서버로 다이렉트로 접속하는게 정책상 막혀 있어 중간에 프록시 서버를 두어 망연계 설정을 하고 통신하도록 했습니다

프록시 설정은 RestTemplate 에서 가능하구요

이것도 원인이 아니라면 클라이인트와 서버간 통신이 안되는 원인부터 먼저 파악하셔야 될 것 같습니다

신석균님의 프로필 이미지
신석균
질문자

감사 합니다.

설정에서 issuer-url 를 삭제하고 authorization-uri, token-uri, jwk-set-uri, user-info-uri, user-name-attribute 하니 Spring Boot 내장 WAS 가 정상적으로 실행됩니다.

issuer-url 에서 메타 데이터를 가져외서 설정 작업을 진행할때 Spring Authorization Server 로 구현한 자체 인가서버 실행되기 이전이기 떄문에 issuer-url 에서 연결이 되지 않는데

 

아마도 issuer-url 을 설정하지 않고 authorization-uri, token-uri, jwk-set-uri, user-info-uri, user-name-attribute 을 따로 설정하면 endpoint 정보만 가져오기 떄문에 정상적으로 실행된거 같습니다.

 

spring:
  security:
    oauth2:
      client:
        # OAuth2 Provider 등록 정보
        # Spring Security OAuth2 Client의 기본 Provider(google, facebook, github, okta)은 설정되어 있어 추가하지 않아도 된다.
        provider:
          # 인증서버 자체 로그인 Provider 설정
          local:
            # 인증서버는 OIDC 기반ㅇㄹ 구현하였으므로  issuer-uri 만 설정하면 되는데 WAS 구동시  issuer-uri에서 authorization-uri등
            # issuer-uri ODIC Endpoint를 가져와서 설정을 시도하는데
            authorization-uri: ${oauth2-config.authorization.issuer-url}/oauth2/authorize
            token-uri: ${oauth2-config.authorization.issuer-url}/oauth2/token
            jwk-set-uri: ${oauth2-config.authorization.issuer-url}/oauth2/jwks
            user-info-uri: ${oauth2-config.authorization.issuer-url}/oauth2/userinfo
            user-name-attribute: 'sub'

 

0

안녕하세요, 인프런 AI 인턴이에요.

Spring Authorization Server와 OAuthClient를 사용하여 SSO 시스템을 개발 중인데, OAuth2 Client 등록 및 관리자 화면 접속을 위해 로그인 페이지가 필요하다고 하셨습니다. 그러나, WAS가 실행되지 않은 상태에서 OAuth2 Provider 정보를 가져오는 과정에서 Connection refused 예외가 발생한다고 하셨습니다. 이 문제에 대해 처리하기 위해 Java Config에서 ClientRegistrationRepository를 이용하여 등록하는 것을 고민하고 있다고 하셨는데, 해당 방법에서 에러가 발생한다고 하셨습니다.

해당 에러는 ClientRegistrationRepository가 현재 생성 중인 Requested bean과 관련된 순환참조 문제라고 합니다. 따라서, 다른 방법을 시도해 볼 필요가 있습니다.

spring.security.oauth2.client.registration 내 provider 영역에 직접 issuer-uri 정보를 등록하는 방식으로 시도해볼 수 있습니다. 이 경우, Spring 설정 파일에서 아래와 같이 등록하면 됩니다.

spring:
security:
oauth2:
provider:
local:
issuer-uri: http://localhost:8080/oauth/authorize

위 코드에서는 로컬의 OAuth2 Provider URI 정보를 직접 등록하고 있습니다. 이렇게 등록하면 OAuth2 Provider 정보를 가져올 때 예외가 발생하지 않습니다.

위 방법도 동작하지 않는다면, Authorization Server 설정 등을 다시한번 확인하는 것도 필요할 수 있습니다. 이런 경우, 전체적인 설정 코드 블록을 공유해주시면 더 정확한 답변을 드릴 수 있을 것 같습니다.

문제 해결에 도움이 되었기를 바랍니다. 감사합니다.

신석균님의 프로필 이미지
신석균

작성한 질문수

질문하기