[Issue] DNS with www | JeongKeepsCalm

[Issue] DNS with www

Issue

  • “www” 포함이 안된 도메인은 본인 인증소셜 로그인 작동 x
  • 해결방안: ENUM 혹은 redirectUri 에 하드코딩 된 도메인 정보를 Request 객체를 활용하여 분기처리

본인 인증

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Value("${spring.profiles.active}")
private List<String> SPRING_PROFILES_ACTIVE;
private String CERTIFICATION_PASS_PATH = SwitchUrl.LICENSE_PATH.getName();

private void setSiteUrlAndRootDir(HttpServletRequest request) {

  // 운영 환경
  if (SPRING_PROFILES_ACTIVE.contains("prod")) {
    // 하드코딩 된 ENUM을 사용하지 않고 request를 활용하여 코드 적용
    // SITE_URL = SwitchUrl.PROD.getName();
    SITE_URL = getCurrentDomainUrl(request);
  } else {
    // 로컬 환경
    SITE_URL = SwitchUrl.LOCAL.getName();
    ROOT_DIR = CERTIFICATION_PASS_PATH;
    try {
      ROOT_DIR = new ClassPathResource(CERTIFICATION_PASS_PATH).getFile().getAbsolutePath();
    } catch (IOException ioException) {
      log.info("test");
    }
  }

}

private String getCurrentUrl(HttpServletRequest request) {
  String scheme = request.getScheme();
  String serverName = request.getServerName();
  int serverPort = request.getServerPort();

  String url = scheme+"://"+serverName;
  if((scheme.equals("http") && serverPort != 88)) url += ":" + serverPort;

  return url;
}


소셜 로그인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// set bean in config file
@Bean
public OAuth2AuthorizationRequestResolver customAuthorizationRequestResolver() {
  return new CustomAuthorizationRequestResolver(clientRegistrationRepository);
}

// CustomAuthorizationRequestResolver.java
@Slf4j
public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {

  private final OAuth2AuthorizationRequestResolver defaultResolver;

  public CustomAuthorizationRequestResolver(ClientRegistrationRepository clientRegistrationRepository) {
      this.defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(
          clientRegistrationRepository, "/api/auth/oauth2");
  }

  @Override
  public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
    OAuth2AuthorizationRequest authorizationRequest = defaultResolver.resolve(request);
    return customizeAuthorizationRequest(authorizationRequest, request);
  }

  @Override
  public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
    OAuth2AuthorizationRequest authorizationRequest = defaultResolver.resolve(request, clientRegistrationId);
    return customizeAuthorizationRequest(authorizationRequest, request);
  }

  private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest authorizationRequest, HttpServletRequest request) {
    if (authorizationRequest == null) {
      return null;
    }

    String registrationId = extractRegistrationId(request);
    String redirectUri = determineRedirectUri(request, registrationId);

    return OAuth2AuthorizationRequest.from(authorizationRequest)
        .redirectUri(redirectUri)     // redirectUri 직접 설정
        .additionalParameters(authorizationRequest.getAdditionalParameters())
        .build();
  }

  private String extractRegistrationId(HttpServletRequest request) {
    String requestUri = request.getRequestURI();
    String[] uriParts = requestUri.split("/");
    return uriParts[uriParts.length - 1];
  }

  private String determineRedirectUri(HttpServletRequest request, String registrationId) {
    String host = request.getHeader("host");
    String baseUri = "https://" + (host != null && host.contains("www.") ? "www." : "") + "test.co.kr/api/auth/oauth2/callback/";

    switch (registrationId) {
      case "kakao":
        return baseUri + "kakao";
      case "google":
        return baseUri + "google";
      case "naver":
        return baseUri + "naver";
      default:
        throw new IllegalArgumentException("Unknown registrationId: " + registrationId);
    }
  }
}

// SecurityConfig.java
private void oAuth2LoginConfig() throws Exception {
  httpSecurity.oauth2Login(oauth2 -> oauth2
    .loginPage(MAIN_LOG_IN_PAGE)
    .authorizationEndpoint(endpoint -> endpoint
        .authorizationRequestResolver(customAuthorizationRequestResolver())
    )
    ...
    .permitAll()
  );
}

determineRedirectUri 매서드를 통해 yaml 파일에 설정된 redirectUri를 분기처리하여 재설정한다.