티스토리 뷰
Spring Security를 이용하다 보면 자동화된 설정이 많아 정말 편리하지만
그럼에도 불구하고 커스텀 설정을 추가해야 하는 경우가 많다
이 글에서는 그중에서 OAuth2 Config에 관해 헤맸던 부분을 다시 정리해보려 한다
프로젝트가 크지 않다면 모든 보안 설정을 SecurityConfig 하나에 모아두는 선택은 나쁘지 않다
나는 Spring Security 공부를 하며 이것저것 시도해보느라 설정이 많아졌고
자연스레 그 설정에서 사용하는 Custom Bean들도 많아서
SecurityConfig에 다 때려박으면 스크롤이 길어져 가독성이 좋지 못하고
남들이 보기에 깔끔하지 못한 코드가 될 수 있을 것 같아 분리했다
나의 경우엔 아래와 같이 설정을 나눠놨다
최대한 세분화하여 나눴고 MethodSecurityConfig의 경우에는
메서드 방식의 권한 확인을 활성화시키는 애너테이션 하나만 존재한다
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
다음 사진은 SecurityConfig에서 분리해내고 싶던 OAuth2 관련 설정이다
아래 코드는 WebSecurityConfigurerAdapter를 상속 받았을 때 Override 하여
보안 설정을 하는 configure 메서드 안에 위치한다
인텔리제이는 줄 별로 나눠 작성하면 오른쪽에 현재의 context를 보여주기 때문에 붙여 쓰지 않고 나눠 썼다
처음엔 OAuth2SecurityConfig를 새로 만들어 configure 메서드에 위 코드를 그대로 옮겨 놓고
따로 테스트는 진행하지 않고 '와 잘 분리해냈다' 하고 뿌듯하게 다른 파트를 진행했다
그러다 다시 Security 설정을 만져야 할 일이 있어 코드 보는 김에 몇몇 코드를 리팩토링하기로 했다
아래 코드도 OAuth2 관련 예제들에서 if 문을 덕지덕지 발라놔서 보기 싫어 수정을 거친 것인데
고친 코드도 if문 도배보다는 낫지만 여전히 지저분해 보이는 건 어쩔 수 없다
핵심은 switch문을 메서드 추출해 가독성을 향상하는 것이다
getRegistration method에서 parameter인 (String client)는 연동시킬 사이트의 이름을 의미한다
String -> Enum 변환 과정을 찾아보았고 Enum.valueOf()를 이용하기로 했다
아래 코드는 위와 정확히 같은 동작을 수행한다 메서드 추출을 통해 가독성을 향상했고
자세히 보면 clientRegistrationRepository 메서드에서도 불필요한 null 체크를 하지 않아도 되게 만들었다
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
List<ClientRegistration> registrations = CLIENTS.stream()
.map(this::getRegistration)
.collect(Collectors.toList());
return new InMemoryClientRegistrationRepository(registrations);
}
private ClientRegistration getRegistration(String client) {
String clientId = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-id");
String clientSecret = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-secret");
return CustomOAuth2Provider.valueOf(client.toUpperCase())
.getBuilder(client)
.clientId(clientId)
.clientSecret(clientSecret)
.build();
}
CustomOAuth2Provider는 스프링 시큐리티가 제공하는 CommonOAuth2Provider에 코드를 가져와
Naver, Kakao의 정보를 같은 형태로 추가한 것이다
코드 통일성을 위해 Common과 혼용하지 않고 전부 Custom을 사용하도록 작성했다
다음 글에서는 SecurityConfig 분리와 리팩토링 후 테스트 과정에서 만난 403, 404 에러에 대해 작성할 것이다
'Spring > Spring Security' 카테고리의 다른 글
[JWT] 회원 아이디 & 비밀번호 찾기 feat. coolsms-api (0) | 2021.11.06 |
---|---|
[JWT] jwt 로그아웃 구현 (0) | 2021.11.04 |
[OAuth2] /oauth2/authorization/github 404 (0) | 2021.10.23 |
[PreAuthorize] Annotation Custom Check Method, 커스텀 체크 (0) | 2021.10.11 |
[OAuth2] SpringBoot OAuth2 적용기 & 깨지는 테스트 살리기 (0) | 2021.09.18 |