[Spring Authorization Server Sample 따라 구현하기] 불필요한 코드 제거하기

2024. 10. 1. 02:36Spring Security/Spring Authorization Server

반응형

개요

OAuth2 인증 구조가 동작함을 확인하였고, H2 DB도 조회해보았다.

이번엔 DB 이관에 앞서, 이번 구현에서 다루지 않을 코드들을 제거하는 과정을 진행한다.

주로 구현한 인증 서버를 다시 클라이언트로 하는 OAuth2 설정과, 디바이스 인증에 관한 부분이다.

나중에 쓸 수도 있지 않은가? 그럼 나중에 추가하면 될 일이다.

Resource Server

리소스 서버의 구조는 다음과 같았다.

기본적인 보안 설정과 데이터를 제공하는 컨트롤러 하나만 가지고 있으므로, 리소스 서버에서는 제거할 부분이 존재하지 않는다.

Client Server

클라이언트 서버의 구조는 다음과 같다.

클라이언트 서버에서는 제거하고픈 설정이 다소 존재한다.

Application.yml

디바이스 인증을 등록한 클라이언트 설정 부분을 제거한다.

spring:
  security:
    oauth2:
      client:
        registration:
                    messaging-client-device-code:
                                provider: spring
                                client-id: device-messaging-client
                                client-authentication-method: none
                                authorization-grant-type: urn:ietf:params:oauth:grant-type:device_code
                                scope: message.read,message.write
                                client-name: messaging-client-device-code

resources/templates

  • 디바이스 인증 관련 화면인 device-activate.html, device-authorize.html 을 제거한다.
  • page-templates.html 에서 디바이스 인증 드롭다운을 제거한다.
<li><a class="dropdown-item" href="/authorize?grant_type=device_code" th:href="@{/authorize?grant_type=device_code}">Device Code</a></li>

resources/static/assets/img

디바이스 이미지인 devices.png 를 제거한다.

web

  • 디바이스 인증 관련 엔드포인트를 호출하는 DeviceController 를 제거한다.
  • AuthorizationController 에서 디바이스 인증 결과를 호출하는 deviceCodeGrant() 메서드를 제거한다.
@GetMapping(value = "/authorize", params = "grant_type=device_code")
    public String deviceCodeGrant() {
        return "device-activate";
    }

config

WebClientConfig 에서 deviceAuthorizedClientManager 설정을 제거한다.

@Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(
            ClientRegistrationRepository clientRegistrationRepository,
            OAuth2AuthorizedClientRepository authorizedClientRepository) {
                OAuth2AuthorizedClientProvider authorizedClientProvider =
                OAuth2AuthorizedClientProviderBuilder.builder()
                        ...
                        .provider(new DeviceCodeOAuth2AuthorizedClientProvider())
                        .build();

          ...
        authorizedClientManager.setContextAttributesMapper(DeviceCodeOAuth2AuthorizedClientProvider
                .deviceCodeContextAttributesMapper());

                ...
    }

authorization

이 패키지에 존재하는 클래스들은 전부 디바이스 인증과 관련되어 있다.

DeviceCodeOAuth2AuthorizedClientProvider, OAuth2DeviceAccessTokenResponseClient, OAuth2DeviceGrantRequest 클래스를 전부 제거한다.

변경된 구조

Authorization Server

인증 서버의 구조는 아래와 같다.

인증 서버에서 또한 디바이스 설정을 제거할 것이고, 아울러 github, google 로그인과 같은 기타 OAuth2 로그인 설정 또한 제거할 것이다.

resource/templetes

  • 디바이스 인증 관련 설정인 device-activate.html, device-activated.html 을 제거한다.
  • login.html 에서 google, github 로그인 버튼을 제거한다.
<div>
  <button class="w-100 btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
  <a class="w-100 btn btn-light btn-block bg-white" href="/oauth2/authorization/google-idp" role="link" style="margin-top: 10px">
      <img src="/assets/img/google.png" th:src="@{/assets/img/google.png}" width="20" style="margin-right: 5px;" alt="Sign in with Google">
      Sign in with Google
  </a>
  <a class="w-100 btn btn-light btn-block bg-white" href="/oauth2/authorization/github-idp" role="link" style="margin-top: 10px">
      <img src="/assets/img/github.png" th:src="@{/assets/img/github.png}" width="24" style="margin-right: 5px;" alt="Sign in with Github">
      Sign in with Github
  </a>
</div>

resource/img

구현 계획에 없는 devices.png, github.png, google.png 파일을 제거한다.

web

  • 디바이스 인증 관련 엔드포인트인 DeviceController 를 제거한다.
  • 권한 동의 화면 엔드포인트인 AuthorizationConsentController 에서 디바이스 인증 관련 설정을 제거한다.
@GetMapping(value = "/oauth2/consent")
public String consent(...) {

  ...    
        if (StringUtils.hasText(userCode)) {
        model.addAttribute("requestURI", "/oauth2/device_verification");
    } 
    ...

    return "consent";
}

authentication

디바이스 인증 통과시 SecurityContext 를 관리하는 DeviceClientAuthenticationProvider.java, DeviceClientAuthenticationToken.java 를 제거한다.

config

AuthorizationServerConfig.java 에서 디바이스 인증 관련 설정들을 제거한다.

public SecurityFilterChain authorizationServerSecurityFilterChain(...) throws Exception {

    ...

    DeviceClientAuthenticationProvider deviceClientAuthenticationProvider =
            new DeviceClientAuthenticationProvider(registeredClientRepository);

    http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
            .deviceAuthorizationEndpoint(deviceAuthorizationEndpoint ->
                        deviceAuthorizationEndpoint.verificationUri("/activate")
              )
              .deviceVerificationEndpoint(deviceVerificationEndpoint ->
                      deviceVerificationEndpoint.consentPage(CUSTOM_CONSENT_PAGE_URI)
              )
            .clientAuthentication(clientAuthentication ->
                    clientAuthentication
                            .authenticationProvider(deviceClientAuthenticationProvider)
            )
            ...
    return http.build();
}

public RegisteredClientRepository registeredClientRepository(...) {
        ...

        RegisteredClient deviceClient = RegisteredClient.withId(UUID.randomUUID().toString())
                .clientId("device-messaging-client")
                .clientAuthenticationMethod(ClientAuthenticationMethod.NONE)
                .authorizationGrantType(AuthorizationGrantType.DEVICE_CODE)
                .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
                .scope("message.read")
                .scope("message.write")
                .build();

        ...
        registeredClientRepository.save(deviceClient);

        return registeredClientRepository;
}

변경된 구조

실행

  • 서버를 재기동하면 google 과 github 버튼이 사라진 로그인 화면을 만날 수 있다.

  • 로그인 이후에는 디바이스 인증 버튼이 사라져있다.

  • 이외 기능들은 여전히 정상동작한다.

결론

멀쩡히 돌아가는 코드니까 제거하지 말까 고민도 하였지만, 구현 방식을 모르는 코드는 없는 게 이해하기 더 편할 거라는 생각이 들었다.

이제 정말 DB를 교체해봐야겠다.

Repository

https://github.com/gigyesik/spring-authorization-server-sample/tree/deleting

반응형