티스토리 뷰

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를 생성하고 테스트해보도록 하겠다.

 

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday