이제 앞에서 했던 자체 Login 필터와 OAuth2 Login 필터 등 Spring Security의 여러 설정을 담당하는
SecurityConfig 클래스를 생성해보려고 합니다!
Spring Security의 설정 파일이라고 생각하면 됩니다!
위치는 global/config에 생성해줬습니다.
SecurityConfig 클래스 생성
전체 코드를 먼저 보여드리고,
전체 코드가 상당히 길기 때문에 부분 부분 코드를 발췌하여 설명드리겠습니다.
🎯 SecurityConfig 전체 코드
package login.oauthtest4.global.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import login.oauthtest4.domain.user.repository.UserRepository;
import login.oauthtest4.global.jwt.filter.JwtAuthenticationProcessingFilter;
import login.oauthtest4.global.jwt.service.JwtService;
import login.oauthtest4.global.login.filter.CustomJsonUsernamePasswordAuthenticationFilter;
import login.oauthtest4.global.login.handler.LoginFailureHandler;
import login.oauthtest4.global.login.handler.LoginSuccessHandler;
import login.oauthtest4.global.login.service.LoginService;
import login.oauthtest4.global.oauth2.handler.OAuth2LoginFailureHandler;
import login.oauthtest4.global.oauth2.handler.OAuth2LoginSuccessHandler;
import login.oauthtest4.global.oauth2.service.CustomOAuth2UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.logout.LogoutFilter;
/**
* 인증은 CustomJsonUsernamePasswordAuthenticationFilter에서 authenticate()로 인증된 사용자로 처리
* JwtAuthenticationProcessingFilter는 AccessToken, RefreshToken 재발급
*/
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final LoginService loginService;
private final JwtService jwtService;
private final UserRepository userRepository;
private final ObjectMapper objectMapper;
private final OAuth2LoginSuccessHandler oAuth2LoginSuccessHandler;
private final OAuth2LoginFailureHandler oAuth2LoginFailureHandler;
private final CustomOAuth2UserService customOAuth2UserService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin().disable() // FormLogin 사용 X
.httpBasic().disable() // httpBasic 사용 X
.csrf().disable() // csrf 보안 사용 X
.headers().frameOptions().disable()
.and()
// 세션 사용하지 않으므로 STATELESS로 설정
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
//== URL별 권한 관리 옵션 ==//
.authorizeRequests()
// 아이콘, css, js 관련
// 기본 페이지, css, image, js 하위 폴더에 있는 자료들은 모두 접근 가능, h2-console에 접근 가능
.antMatchers("/","/css/**","/images/**","/js/**","/favicon.ico","/h2-console/**").permitAll()
.antMatchers("/sign-up").permitAll() // 회원가입 접근 가능
.anyRequest().authenticated() // 위의 경로 이외에는 모두 인증된 사용자만 접근 가능
.and()
//== 소셜 로그인 설정 ==//
.oauth2Login()
.successHandler(oAuth2LoginSuccessHandler) // 동의하고 계속하기를 눌렀을 때 Handler 설정
.failureHandler(oAuth2LoginFailureHandler) // 소셜 로그인 실패 시 핸들러 설정
.userInfoEndpoint().userService(customOAuth2UserService); // customUserService 설정
// 원래 스프링 시큐리티 필터 순서가 LogoutFilter 이후에 로그인 필터 동작
// 따라서, LogoutFilter 이후에 우리가 만든 필터 동작하도록 설정
// 순서 : LogoutFilter -> JwtAuthenticationProcessingFilter -> CustomJsonUsernamePasswordAuthenticationFilter
http.addFilterAfter(customJsonUsernamePasswordAuthenticationFilter(), LogoutFilter.class);
http.addFilterBefore(jwtAuthenticationProcessingFilter(), CustomJsonUsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
/**
* AuthenticationManager 설정 후 등록
* PasswordEncoder를 사용하는 AuthenticationProvider 지정 (PasswordEncoder는 위에서 등록한 PasswordEncoder 사용)
* FormLogin(기존 스프링 시큐리티 로그인)과 동일하게 DaoAuthenticationProvider 사용
* UserDetailsService는 커스텀 LoginService로 등록
* 또한, FormLogin과 동일하게 AuthenticationManager로는 구현체인 ProviderManager 사용(return ProviderManager)
*
*/
@Bean
public AuthenticationManager authenticationManager() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder());
provider.setUserDetailsService(loginService);
return new ProviderManager(provider);
}
/**
* 로그인 성공 시 호출되는 LoginSuccessJWTProviderHandler 빈 등록
*/
@Bean
public LoginSuccessHandler loginSuccessHandler() {
return new LoginSuccessHandler(jwtService, userRepository);
}
/**
* 로그인 실패 시 호출되는 LoginFailureHandler 빈 등록
*/
@Bean
public LoginFailureHandler loginFailureHandler() {
return new LoginFailureHandler();
}
/**
* CustomJsonUsernamePasswordAuthenticationFilter 빈 등록
* 커스텀 필터를 사용하기 위해 만든 커스텀 필터를 Bean으로 등록
* setAuthenticationManager(authenticationManager())로 위에서 등록한 AuthenticationManager(ProviderManager) 설정
* 로그인 성공 시 호출할 handler, 실패 시 호출할 handler로 위에서 등록한 handler 설정
*/
@Bean
public CustomJsonUsernamePasswordAuthenticationFilter customJsonUsernamePasswordAuthenticationFilter() {
CustomJsonUsernamePasswordAuthenticationFilter customJsonUsernamePasswordLoginFilter
= new CustomJsonUsernamePasswordAuthenticationFilter(objectMapper);
customJsonUsernamePasswordLoginFilter.setAuthenticationManager(authenticationManager());
customJsonUsernamePasswordLoginFilter.setAuthenticationSuccessHandler(loginSuccessHandler());
customJsonUsernamePasswordLoginFilter.setAuthenticationFailureHandler(loginFailureHandler());
return customJsonUsernamePasswordLoginFilter;
}
@Bean
public JwtAuthenticationProcessingFilter jwtAuthenticationProcessingFilter() {
JwtAuthenticationProcessingFilter jwtAuthenticationFilter = new JwtAuthenticationProcessingFilter(jwtService, userRepository);
return jwtAuthenticationFilter;
}
}
🎯 SecurityConfig 부분 코드 설명
💻 1. 어노테이션 부분
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
...
}
✅ @EnableWebSecurity 어노테이션
해당 어노테이션 코드를 들어가보면,
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
HttpSecurityConfiguration.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
/**
* Controls debugging support for Spring Security. Default is false.
* @return if true, enables debug support with Spring Security
*/
boolean debug() default false;
}
@Import로 다음과 같이 Spring Security와 관련된 클래스들을 import해주는 것을 알 수 있습니다.
1. WebSecurityConfiguration
2. SpringWebMvcImportSelector
3. OAuth2ImportSelector
4. HttpSecurityConfiguration
따라서, @EnableWebSecurity 어노테이션을 붙여야 Spring Security 기능을 사용할 수 있습니다!
간단히 말해서, Spring Security를 활성화시키는 어노테이션입니다!
💻 2. filterChain 메소드 부분 - Spring Security 설정
Spring Security 5.7버전 이상부터는 Spring Security의 설정 시에
설정 메소드를 @Bean을 통해 빈으로 등록해서 컨테이너가 관리하도록 사용합니다.
(이전에는 빈 등록 대신 WebSecurityConfigurerAdatpter를 상속받아 메소드를 Override했었습니다.)
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// [PART 1]
.formLogin().disable() // FormLogin 사용 X
.httpBasic().disable() // httpBasic 사용 X
.csrf().disable() // csrf 보안 사용 X
.headers().frameOptions().disable()
.and()
// 세션 사용하지 않으므로 STATELESS로 설정
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// [PART 2]
//== URL별 권한 관리 옵션 ==//
.authorizeRequests()
// 아이콘, css, js 관련
// 기본 페이지, css, image, js 하위 폴더에 있는 자료들은 모두 접근 가능, h2-console에 접근 가능
.antMatchers("/","/css/**","/images/**","/js/**","/favicon.ico","/h2-console/**").permitAll()
.antMatchers("/sign-up").permitAll() // 회원가입 접근 가능
.anyRequest().authenticated() // 위의 경로 이외에는 모두 인증된 사용자만 접근 가능
.and()
// [PART 3]
//== 소셜 로그인 설정 ==//
.oauth2Login()
.successHandler(oAuth2LoginSuccessHandler) // 동의하고 계속하기를 눌렀을 때 Handler 설정
.failureHandler(oAuth2LoginFailureHandler) // 소셜 로그인 실패 시 핸들러 설정
.userInfoEndpoint().userService(customOAuth2UserService); // customUserService 설정
// [PART4]
// 원래 스프링 시큐리티 필터 순서가 LogoutFilter 이후에 로그인 필터 동작
// 따라서, LogoutFilter 이후에 우리가 만든 필터 동작하도록 설정
// 순서 : LogoutFilter -> JwtAuthenticationProcessingFilter -> CustomJsonUsernamePasswordAuthenticationFilter
http.addFilterAfter(customJsonUsernamePasswordAuthenticationFilter(), LogoutFilter.class);
http.addFilterBefore(jwtAuthenticationProcessingFilter(), CustomJsonUsernamePasswordAuthenticationFilter.class);
return http.build();
}
세부적인 보안 기능 설정 API를 제공하는 HttpSecurity를 파라미터로 받아서
HttpSecurity의 보안 기능 설정 API를 사용하여
최종적으로 여러 설정을 마친 SecurityFilterChain 객체를 반환하는 메소드입니다.
설정 메소드인만큼, 코드가 길기 때문에 주석에 적힌 PART별로 나눠서 설명하도록 하겠습니다!
✅ [PART 1] 기타 설정
// [PART 1]
.formLogin().disable() // FormLogin 사용 X
.httpBasic().disable() // httpBasic 사용 X
.csrf().disable() // csrf 보안 사용 X
.headers().frameOptions().disable()
.and()
// 세션 사용하지 않으므로 STATELESS로 설정
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
1. formLogin().disable()
Spring Security에서는 아무 설정을 하지 않으면,
기본으로 FormLogin 형식의 로그인을 제공합니다.
제 프로젝트에서는 자체 Login으로 로그인을 진행하기 때문에, 기본 방식을 disable했습니다.
2. httpBasic().disable()
제 프로젝트는 JWT 토큰을 사용한 로그인(Bearer 방식)이기 때문에
기본 설정인 httpBasic은 disable했습니다.
3. csrf().disable()
제 프로젝트는 REST API를 사용하여 서버에 인증 정보를 저장하지 않고,
요청 시 인증 정보(JWT 토큰, OAuth2)를 담아서 요청하므로
보안 기능인 csrf가 필요가 없으므로 disable했습니다.
4. headers().frameOptions().disable()
Spring Security는 기본적으로 X-Frame-Options Click jacking 공격 막기 설정이 되어있습니다.
h2 콘솔(iframe)을 사용하기 때문에 disable로 h2 콘솔에 접근 가능하도록 했습니다.
(X-Frame-Options Click jacking 공격 막기에 관한 내용은 공부를 더 해봐야 할 것 같습니다.)
5. sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
세션을 사용하지 않기 때문에 세션 정책을 Stateless로 설정합니다.
✅ [PART 2] URL별 인증/인가 설정
// [PART 2]
//== URL별 권한 관리 옵션 ==//
.authorizeRequests()
// 아이콘, css, js 관련
// 기본 페이지, css, image, js 하위 폴더에 있는 자료들은 모두 접근 가능, h2-console에 접근 가능
.antMatchers("/","/css/**","/images/**","/js/**","/favicon.ico","/h2-console/**").permitAll()
.antMatchers("/sign-up").permitAll() // 회원가입 접근 가능
.anyRequest().authenticated() // 위의 경로 이외에는 모두 인증된 사용자만 접근 가능
1. authorizeRequests()
인증/인가 설정 시 HttpServletRequest를 이용한다는 것을 의미합니다.
2. antMatchers("URL").permitAll()
antMatchers의 파라미터에 설정한 URL은 모든 리소스의 접근을 인증 없이 사용 가능하다는 의미입니다.
따라서, 인증 절차 없이 접근할 URL을 지정합니다.
(ex : 회원가입 페이지는 인증 절차 없이 접근가능해야 하므로 회원가입 API URL 설정)
3. anyRequest().authenticated()
모든 리소스(anyRequest)는 인증 절차를 거친 사용자만 접근이 가능하다는 의미입니다.
위에서부터 순차적으로 코드가 실행되어 HttpSecurity에 설정되기 때문에
위에 antMatchers().permitAll()로 설정한 URL 이외의 모든 URL은 인증을 거쳐야 함을 의미합니다.
✅ [PART 3] 소셜 로그인 (OAuth2 Login) 설정
// [PART 3]
//== 소셜 로그인 설정 ==//
.oauth2Login()
.successHandler(oAuth2LoginSuccessHandler) // 동의하고 계속하기를 눌렀을 때 Handler 설정
.failureHandler(oAuth2LoginFailureHandler) // 소셜 로그인 실패 시 핸들러 설정
.userInfoEndpoint().userService(customOAuth2UserService); // customUserService 설정
1. oauth2Login()
Http Security의 OAuth2 로그인 관련 OAuth2LoginConfigurer를 반환하여
OAuth2 로그인에 관련된 다양한 기능을 사용할 수 있도록 합니다.
2. successHandler()
OAuth2 로그인이 성공했을 때 처리할 핸들러를 설정해줍니다.
제 프로젝트에서는 oAuth2LoginSuccessHandler를 생성하여 설정하였습니다.
(제가 쓴 로그인 구현 과정의 7번에서 생성했었습니다. - https://ksh-coding.tistory.com/66)
3. failureHandler()
OAuth2 로그인이 실패했을 때 처리할 핸들러를 설정해줍니다.
제 프로젝트에서는 oAuth2LoginFailureHandler를 생성하여 설정하였습니다.
(제가 쓴 로그인 구현 과정의 7번에서 생성했었습니다. - https://ksh-coding.tistory.com/66)
4. userInfoEndpoint().userService()
OAuth2 로그인의 로직을 담당하는 Service를 설정할 수 있습니다.
제 프로젝트에서는 OAuth2UserService를 커스텀한 customOAuth2UserService를
생성하여 설정해줬습니다.
(제가 쓴 로그인 구현 과정의 7번에서 생성했었습니다. - https://ksh-coding.tistory.com/66)
✅ [PART 4] 스프링 시큐리티에 커스텀 필터 추가 설정
// [PART4]
// 원래 스프링 시큐리티 필터 순서가 LogoutFilter 이후에 로그인 필터 동작
// 따라서, LogoutFilter 이후에 우리가 만든 필터 동작하도록 설정
// 순서 : LogoutFilter -> JwtAuthenticationProcessingFilter -> CustomJsonUsernamePasswordAuthenticationFilter
http.addFilterAfter(customJsonUsernamePasswordAuthenticationFilter(), LogoutFilter.class);
http.addFilterBefore(jwtAuthenticationProcessingFilter(), CustomJsonUsernamePasswordAuthenticationFilter.class);
1. addFilterAfter(A, B)
B 필터 이후에 A 필터가 동작하도록 하는 메소드입니다.
원래 스프링 시큐리티 필터 동작 순서가 LogoutFilter 이후에 로그인 필터가 동작하기 때문에,
우리가 만든 커스텀 JSON 로그인 필터인 CustomJsonUsernamePasswordAuthenticationFilter를
LogoutFilter 이후에 동작하도록 설정하였습니다.
2. addFilterBefore(A, B)
addFilterAfter(A, B)와는 반대로, B 필터 이전에 A 필터가 동작하도록 하는 메소드입니다.
우리가 만든 커스텀 JSON 로그인 필터 동작 전에 JWT 인증 필터가 동작하도록 하기 위해
JwtAuthenticationProcessingFilter를 CustomJsonUsernamePasswordAuthenticationFilter 전으로
설정하였습니다.
💻 3. Bean 등록 부분
//[PART 1]
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
//[PART 2]
/**
* AuthenticationManager 설정 후 등록
* PasswordEncoder를 사용하는 AuthenticationProvider 지정 (PasswordEncoder는 위에서 등록한 PasswordEncoder 사용)
* FormLogin(기존 스프링 시큐리티 로그인)과 동일하게 DaoAuthenticationProvider 사용
* UserDetailsService는 커스텀 LoginService로 등록
* 또한, FormLogin과 동일하게 AuthenticationManager로는 구현체인 ProviderManager 사용(return ProviderManager)
*
*/
@Bean
public AuthenticationManager authenticationManager() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder());
provider.setUserDetailsService(loginService);
return new ProviderManager(provider);
}
//[PART 3]
/**
* 로그인 성공 시 호출되는 LoginSuccessJWTProviderHandler 빈 등록
*/
@Bean
public LoginSuccessHandler loginSuccessHandler() {
return new LoginSuccessHandler(jwtService, userRepository);
}
/**
* 로그인 실패 시 호출되는 LoginFailureHandler 빈 등록
*/
@Bean
public LoginFailureHandler loginFailureHandler() {
return new LoginFailureHandler();
}
//[PART 4]
/**
* CustomJsonUsernamePasswordAuthenticationFilter 빈 등록
* 커스텀 필터를 사용하기 위해 만든 커스텀 필터를 Bean으로 등록
* setAuthenticationManager(authenticationManager())로 위에서 등록한 AuthenticationManager(ProviderManager) 설정
* 로그인 성공 시 호출할 handler, 실패 시 호출할 handler로 위에서 등록한 handler 설정
*/
@Bean
public CustomJsonUsernamePasswordAuthenticationFilter customJsonUsernamePasswordAuthenticationFilter() {
CustomJsonUsernamePasswordAuthenticationFilter customJsonUsernamePasswordLoginFilter
= new CustomJsonUsernamePasswordAuthenticationFilter(objectMapper);
customJsonUsernamePasswordLoginFilter.setAuthenticationManager(authenticationManager());
customJsonUsernamePasswordLoginFilter.setAuthenticationSuccessHandler(loginSuccessHandler());
customJsonUsernamePasswordLoginFilter.setAuthenticationFailureHandler(loginFailureHandler());
return customJsonUsernamePasswordLoginFilter;
}
//[PART 5]
@Bean
public JwtAuthenticationProcessingFilter jwtAuthenticationProcessingFilter() {
JwtAuthenticationProcessingFilter jwtAuthenticationFilter = new JwtAuthenticationProcessingFilter(jwtService, userRepository);
return jwtAuthenticationFilter;
}
이 부분은 스프링 시큐리티 로그인 동작 원리를 이해해야 합니다.
거의 대부분을 아래의 블로그를 참고했기 때문에
원리를 이해하고 싶으면 아래의 블로그를 참고하여 원리를 이해해봅시다.
https://ttl-blog.tistory.com/268
스프링부트 게시판 API 만들기 (3) - JSON 로그인 (2) - 시큐리티 로그인 동작원리
이번에는 지난 포스팅에 이어서 스프링 시큐리티를 이용하여 로그인을 진행하는 코드를 작성하기 전에 스프링 시큐리티의 로그인 진행방식을 살펴보겠습니다. 이번 포스팅은 조금 길기 때문에
ttl-blog.tistory.com
https://ttl-blog.tistory.com/269
스프링부트 게시판 API 만들기 (4) - JSON 로그인 (3) - 시큐리티 JSON 로그인 커스텀하기
이번에는 저번 포스팅에 이어서 시큐리티 필터를 커스텀하여 로그인을 진행해보도록 하겠습니다. 시큐리티를 이용한 JSON 데이터로 로그인 (진행 중) JWT를 이용한 인증 도메인, 테이블 설계, 엔
ttl-blog.tistory.com
PART 1. passwordEncoder 빈 등록
Provider에 설정할 PasswordEncoder를 빈으로 등록합니다.
PART 2. AuthenticationManager 빈 등록
다음에 나오는 커스텀 필터 빈 등록 코드에서 AuthenticationManager를 설정하기 위해
AuthenticationManager를 반환하는 메소드를 빈으로 등록합니다.
기존 스프링 시큐리티 로그인인 FormLogin에서 사용하는 Provider인
DaoAuthenticationProvider를 사용하여 AuthenticationManager를 생성하여 반환합니다.
(ProviderManager는 AuthenticationManager의 구현체입니다.)
Provider에서 이전에 설정한 PasswordEncoder를 설정하고,
이전에 만들었던 UserDetails 유저를 반환하는 LoginService를 설정한 후 반환합니다.
(제가 쓴 로그인 구현 과정의 4번에서 생성했었습니다. - https://ksh-coding.tistory.com/60)
PART 3. LoginSuccessHandler & LoginFailureHandler 빈 등록
다음 PART 4의 JSON 필터 빈 등록 시에 설정할 핸들러를 먼저 빈으로 등록합니다.
이전에 만들어뒀던 LoginSuccessHandler & LoginFailureHandler를 생성하여 반환합니다.
(제가 쓴 로그인 구현 과정의 4번에서 생성했었습니다. - https://ksh-coding.tistory.com/60)
PART 4. CustomJsonUsernamePasswordAuthenticationFilter 빈 등록
이전에 만들어뒀던 AbstractAuthenticationProcessingFilter를 상속한
커스텀 JSON 인증 필터를 빈으로 등록합니다.
커스텀 JSON 인증 필터에 PART 2에서 등록한 AuthenticationManager를 설정하고,
PART 3에서 등록한 로그인 성공, 실패 핸들러를 설정한 후에 반환합니다.
PART 5. JwtAuthenticationProcessingFilter 빈 등록
JWT 인증 처리를 담당하는 JWT 인증 필터를 빈으로 등록합니다.
(제가 쓴 로그인 구현 과정의 3번에서 생성했었습니다. - https://ksh-coding.tistory.com/59)
📖 깃허브 링크 (전체 코드)
https://github.com/KSH-beginner/oauth2WithJwtLogin
GitHub - KSH-beginner/oauth2WithJwtLogin
Contribute to KSH-beginner/oauth2WithJwtLogin development by creating an account on GitHub.
github.com
📕 전체 로그인 구현 목차
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (1) - 회원(User) 관련 클래스 생성
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (2) - JWT란?
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (3) - JWT 관련 클래스 생성 / JWT 인증 로직
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (4) - 자체 JSON 로그인 커스텀하기
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (5) - OAuth란? / OAuth 2.0 인증 과정 예시
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (6) - OAuth 2.0 로그인 구현 사전 설정
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (7) - OAuth 2.0 로그인 관련 클래스 생성
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (8) - SecurityConfig 설정 클래스 생성
Spring Security + JWT를 이용한 자체 Login & OAuth2 Login API 구현 (9)- JWT 자체 로그인 & OAuth2 Login 테스트
Reference
https://ttl-blog.tistory.com/268
스프링부트 게시판 API 만들기 (3) - JSON 로그인 (2) - 시큐리티 로그인 동작원리
이번에는 지난 포스팅에 이어서 스프링 시큐리티를 이용하여 로그인을 진행하는 코드를 작성하기 전에 스프링 시큐리티의 로그인 진행방식을 살펴보겠습니다. 이번 포스팅은 조금 길기 때문에
ttl-blog.tistory.com
https://ttl-blog.tistory.com/269
스프링부트 게시판 API 만들기 (4) - JSON 로그인 (3) - 시큐리티 JSON 로그인 커스텀하기
이번에는 저번 포스팅에 이어서 시큐리티 필터를 커스텀하여 로그인을 진행해보도록 하겠습니다. 시큐리티를 이용한 JSON 데이터로 로그인 (진행 중) JWT를 이용한 인증 도메인, 테이블 설계, 엔
ttl-blog.tistory.com