Springboot JWT 로그인 - (1) Filter에 대한 이해

2022. 6. 6. 12:34·프로젝트/JWT 방식 인증&인가 시리즈

JWT에 대한 기초 지식은 아래 포스팅을 통해 먼저 알아보고 오자

    • Json Web Token 정리
    • JWT 사용이유

JWT

이제 jwt를 왜 사용해야하는지는 충분히 알았을 거라 생각하고 어떤 매커니즘으로 jwt를 이용해서 로그인을 구현하고 인증과 인가를 처리하는지 알아보도록 하자.

 

우리가 가장 먼저 해야할 부분은 JWT를 사용하기 위해 의존성을 추가하는 것이다. 스프링 시큐리티과 JWT를 이용하여 인증/인가를 구현할 것이므로 관련 의존성을 추가해준다.

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'com.auth0:java-jwt:3.19.2'

 

Spring Security Configuration

스프링 시큐리티를 사용하기 위해 기본적으로 설정파일을 작성해줘야 한다. config 패키지를 생성하고 해당 패키지에 SecurityConfig 클래스를 생성한다.

SecurityConfig 클래스

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	private final CorsFilter corsFilter;

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.csrf().disable();
		http
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)	// 세션 사용 안함
                .and()
                .addFilter(corsFilter)	// 인증(O), security Filter 에 등록 / @CrossOrigin (인증X)
                .formLogin().disable()	// Form login 안함
                .httpBasic().disable()
                .authorizeRequests()	
                // >>> 이 부분은 각자 맞게 작성하면 된다
                .antMatchers("/v1/api/member", "/v1/api/member/all", "/v1/api/member/email")
                .access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/v1/api/manager/**")
                .access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/v1/api/admin/**")
                .access("hasRole('ROLE_ADMIN')")
                // <<< 이 부분은 각자 맞게 작성하면 된다
                .anyRequest()		// 그 외 모든 요청에 대해서 허용하라.
                .permitAll();
	}
}
  1. .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    • 세션을 사용하지 않을 것이므로 Stateless 하게 만든다.
  2. formLogin().disable()
    • FormLogin 방식의 로그인을 사용하지 않을 것이므로 disable() 처리한다.
  3. httpBasic().disable()
    • 맨 위에서 말했던 JWT 사용이유에 적었던 부분으로 JWT은 httpBearer 방식이므로 httpBasic 방식은 disable() 처리 한다.
  4. antMatchers & access
    • 어디로의 요청이냐에 따라 맞는 권한 여부를 확인하게 한다.
  5. CORS 차단을 해제하고, JWT 방식으로만 검증할 것이므로 CorsFilter를 추가한다.
    • CorsFilter 클래스를 생성해서 넣어준다.

CorsFilter 클래스

@Configuration
public class CorsConfig {

	@Bean
	public CorsFilter corsFilter() {
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		CorsConfiguration config = new CorsConfiguration();
		config.setAllowCredentials(true); 	// json 서버 응답을 자바스크립트에서 처리할 수 있게 해줌
		config.addAllowedOrigin("*");		// 모든 ip에 응답을 허용
		config.addAllowedMethod("*");		// 모든 HTTP METHOD 에 허용
		config.addAllowedHeader("*");		// 모든 HTTP HEADER 에 허용
		source.registerCorsConfiguration("/v1/api/**", config);

		return new CorsFilter(source);
	}
}
  • CORS 차단을 해제한 CorsFilter 클래스를 새로 만들어준다.

정리

지금 JWT를 사용하기 위해 스프링 시큐리티를 설정하고 있고, CORS로 인한 차단을 해제하기 위해 CorsConfig 클래스 내에 CorsFilter 클래스를 새로 만들어줬으며, JWT 이외의 방식에서 사용되는 session, http basic, loginform 등의 인증방식을 제거해줬다.
스프링 시큐리티를 사용하고자 한다면 기본적으로 세팅해야 하는 부분들이니 잘 숙지하도록 하자.

위 도식도는 HttpRequest, HttpResponse에 대한 Spring의 처리 절차를 보여준다. 우선적으로 Filter가 가장 먼저 request, response를 만나게 되는 것을 볼 수 있다. 이 Filter에 우리가 사용하는 Spring Security Filter도 포함이 되는 것이다.

 

저 필터를 확대해서 보면 아래와 같은 모습이 되는 것이다.

SecurityFilter 종류는 여기서 확인해볼 수 있다. CorsFilter, BasicAuthenticationFilter 등을 확인할 수 있다.

 

그럼 생각해보자. 우리는 서비스에 접근하는 사람들을 검증하기 위해 요청자가 Login 시 발급 받았던 토큰 JWT를 확인하므로서 Authentication(인증)을 하는 것이고, 이후 권한을 확인하는 Authorization(인가)을 하게 되는 것이다.

 

이러한 흐름을 먼저 이해하고 다음 포스팅에서 간단하게 Filter를 생성하고 테스트해보도록 하겠다.

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'프로젝트 > JWT 방식 인증&인가 시리즈' 카테고리의 다른 글

Springboot JWT 로그인 - (6) RefreshToken 방식을 사용하도록 변경 & 코드 정리  (5) 2022.06.24
Springboot JWT 로그인 - (5) 클라이언트 요청 시 BasicAuthenticationFilter를 이용한 JWT 검증  (6) 2022.06.20
Springboot JWT 로그인 - (4) UsernamePasswordAuthenticationFilter를 통한 로그인 로직 구현  (0) 2022.06.16
Springboot JWT 로그인 - (3) UserDetails, UserDetailsService 이해  (0) 2022.06.13
Springboot JWT 로그인 - (2) Filter 적용 테스트  (0) 2022.06.09
'프로젝트/JWT 방식 인증&인가 시리즈' 카테고리의 다른 글
  • Springboot JWT 로그인 - (5) 클라이언트 요청 시 BasicAuthenticationFilter를 이용한 JWT 검증
  • Springboot JWT 로그인 - (4) UsernamePasswordAuthenticationFilter를 통한 로그인 로직 구현
  • Springboot JWT 로그인 - (3) UserDetails, UserDetailsService 이해
  • Springboot JWT 로그인 - (2) Filter 적용 테스트
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    mx master s3 for mac
    키보드 손목 받침대
    마우스 패드
    레이저
    마우스
    크로아티아
    부다페스트
    동유럽
    류블라냐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
Springboot JWT 로그인 - (1) Filter에 대한 이해
상단으로

티스토리툴바