Spring Boot + Security로 Oauth 공부하기
이번에는 앞에서 했던 Oauth Session을 내가 구현하면서 마주했던 에러를 정리해보고자 한다
#server:
# servlet:
# context-path: /api
# context-path 때문에 thymeleaf 가 작동을 안하는 거였음
spring:
jpa:
hibernate:
ddl-auto: create
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
main:
allow-bean-definition-overriding: true
application.yml에 context-path라는 설정을 적을 수 있다
context-path는 baseUrl 처럼 요청 경로 앞에 default 값을 붙여주는 것이다
나는 이 context-path가 api 요청 경로에만 적용되는 줄 알았지만
thymeleaf 페이지 경로에도 영향을 주는 것이였다
그래서 thymeleaf가 작동을 안했던 것이였음
spring.security.oauth2.client.registration.google.client-id=${GOOGLE_CLIENT_ID}
spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_CLIENT_SECRET}
spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.google.client-name=google
spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google
spring.security.oauth2.client.registration.google.scope=profile, email
application.properties에
원래는
spring.security.oauth2.client.registration.google.client-authentication-method
라는 값도 설정해주어야했지만 스프링 시큐리티 5버전 이상이 되면서 지원을 하지 않는다는 점
이거는 간단한 문제
내가 바보같이 thymeleaf를 반환하는 Controller를 안 만들었다는...
이 바보야
package com.example.oauth.domain.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/")
public String mainPage() {
return "index";
}
@GetMapping("/home")
public String loginSuccess() {
return "home";
}
}
그리고 SecurityConfig에서 defaultSuccessUrl을 "/home" 경로로 해주었다는 점
package com.example.oauth.global.config.security;
import com.example.oauth.domain.auth.service.CustomOAuth2UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.cors(Customizer.withDefaults())
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(
auth -> auth
.requestMatchers("/", "/oauth2/**", "/api/login/**", "/login/**").permitAll()
.anyRequest().authenticated()
)
.oauth2Login((oauth2) -> oauth2
.userInfoEndpoint((userInfoEndpointConfig) ->
userInfoEndpointConfig.userService(customOAuth2UserService))
.defaultSuccessUrl("/home") // 여기
);
return http.build();
}
}