Spring Security :: Oauth Session(3)

hyunjoon park·2024년 2월 14일
1

Spring Security

목록 보기
8/12

Spring Boot + Security로 Oauth 공부하기

이번에는 앞에서 했던 Oauth Session을 내가 구현하면서 마주했던 에러를 정리해보고자 한다

1. context-path

#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가 작동을 안했던 것이였음


2. Google Oauth API_KEY

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버전 이상이 되면서 지원을 하지 않는다는 점


3. Controller

이거는 간단한 문제

내가 바보같이 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();
  }
}
profile
Backend Developer

0개의 댓글