OAuth2AuthorizedClientService
OAuth2 소셜 로그인을 진행하는 사용자에 대해 우리의 서버는 인증 서버에서 발급 받은 Access 토큰과 같은 정보를 담을 저장소가 필요하다.
기본적으로 인메모리 방식으로 관리되는데 소셜 로그인 사용자 수가 증가하고 서버의 스케일 아웃 문제로 인해 인메모리 방식은 실무에서 사용하지 않는다.
따라서 DB에 해당 정보를 저장하기 위해서는 OAuth2AuthorizedClientService를 직접 작성해야 한다.
JDBC 의존성 추가
JDBC 방식을 지원하기 때문에 JDBC 모듈이 필요하고 JPA를 사용하고 싶은 경우 전부 커스텀해서 만들어야 한다.
- build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}
OAuth2AuthorizedClientService 클래스 생성
- oauth2 > CustomOAuthAuthorizedClientService
@Configuration
public class CustomOAuth2AuthorizedClientService {
public OAuth2AuthorizedClientService oAuth2AuthorizedClientService(JdbcTemplate jdbcTemplate, ClientRegistrationRepository clientRegistrationRepository) {
return new JdbcOAuth2AuthorizedClientService(jdbcTemplate ,clientRegistrationRepository);
}
}
return new를 통해 Jdbc 방식 JdbcOAuth2AuthorizedClientService() 클래스를 응답.
SecurityConfig 등록
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
private final CustomClientRegistrationRepo customClientRegistrationRepo;
private final CustomOAuth2AuthorizedClientService customOAuth2AuthorizedClientService;
private final JdbcTemplate jdbcTemplate;
public SecurityConfig(CustomOAuth2UserService customOAuth2UserService,
CustomClientRegistrationRepo customClientRegistrationRepo,
CustomOAuth2AuthorizedClientService customOAuth2AuthorizedClientService,
JdbcTemplate jdbcTemplate) {
this.customOAuth2UserService = customOAuth2UserService;
this.customClientRegistrationRepo = customClientRegistrationRepo;
this.customOAuth2AuthorizedClientService = customOAuth2AuthorizedClientService;
this.jdbcTemplate = jdbcTemplate;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf((csrf) -> csrf.disable());
http
.formLogin((login) -> login.disable());
http
.httpBasic((basic) -> basic.disable());
http
.oauth2Login((oauth2) -> oauth2
.loginPage("/login")
.clientRegistrationRepository(
customClientRegistrationRepo.clientRegistrationRepository())
.authorizedClientService(
customOAuth2AuthorizedClientService.oAuth2AuthorizedClientService(jdbcTemplate,
customClientRegistrationRepo.clientRegistrationRepository()))
.userInfoEndpoint((userInfoEndpointConfig -> userInfoEndpointConfig
.userService(customOAuth2UserService))));
http
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/", "/oauth2/**", "/login/**").permitAll()
.anyRequest().authenticated());
return http.build();
}
}
JdbcOAuth2AuthorizedClientService 클래스
- 해당 클래스 : 스프링 시큐리티 공식 깃허브
데이터베이스에 해당 테이블 생성
우리가 사용하는 MariaDB 데이터베이스에 OAuth2AuthorizedClientServcie가 사용할 테이블이 존재해야 한다.
아래 명령어를 통해 테이블을 생성할 수 있다.
CREATE TABLE oauth2_authorized_client (
client_registration_id varchar(100) NOT NULL,
principal_name varchar(200) NOT NULL,
access_token_type varchar(100) NOT NULL,
access_token_value blob NOT NULL,
access_token_issued_at timestamp NOT NULL,
access_token_expires_at timestamp NOT NULL,
access_token_scopes varchar(1000) DEFAULT NULL,
refresh_token_value blob DEFAULT NULL,
refresh_token_issued_at timestamp DEFAULT NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (client_registration_id, principal_name)
);
실행 결과
출처
https://www.devyummi.com/page?id=669295c467595141d3d2d28b
'Spring Security > OAuth2' 카테고리의 다른 글
스프링 OAuth2 클라이언트 JWT 1 : 소셜 로그인 실습 목표 (0) | 2025.01.14 |
---|---|
스프링 OAuth2 클라이언트 세션 14 : OAuth2LoginAuthenticationFilter (0) | 2025.01.09 |
스프링 OAuth2 클라이언트 세션 13 : OAuth2AuthorizationRequestRedirectFilter (0) | 2025.01.09 |
스프링 OAuth2 클라이언트 세션 12 : ClientRegistration (0) | 2025.01.09 |
스프링 OAuth2 클라이언트 세션 11 : 커스텀 로그인 페이지 (0) | 2025.01.09 |