강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

API Gateway - Route 처리

user service에서는 토큰 검증을 하지 않나요?

작성

·

265

1

제가 작성한 user-service SecurityConfig 입니다
강의 내용과 최대한 유사하게 작성한거 같은데 GET /users에서 403이 발생하여 문의드립니다.
gateway service에서 토큰 검증을 하여도 user service에서는 검증된 토큰인지 알 수 없으니 403이 발생하는게 맞는거 같은데 강의에서는 api가 제대로 동작하여 왜 그런지 궁금합니다

 

@RequiredArgsConstructor
@Configuration
public class SecurityConfig {
	//AuthenticationManager가 인자로 받을 AuthenticationConfiguraion 객체 생성자 주입
	private final AuthenticationConfiguration authenticationConfiguration;
	private final JwtProvider jwtProvider;

	private static final String[] WHITE_LIST = {"/login", "/h2-console/**", "/health-check", "/welcome", "/join"};

	@Bean
	public SecurityFilterChain config(HttpSecurity http) throws Exception {
		AuthenticationManager authenticationManager = authenticationManager(authenticationConfiguration);
		AuthenticationFilter authenticationFilter = new AuthenticationFilter(
			authenticationManager, jwtProvider);

		http.csrf(csrf -> csrf.disable()) //CSRF 보호를 비활성화. REST API 환경만 비활성화. Web Form 기반에서는 필요.
			.formLogin((auth) -> auth.disable())
			// .httpBasic((auth) -> auth.disable())
			.headers(header -> header.frameOptions(
				frameOptionsConfig -> frameOptionsConfig.disable())
			) //h2 console iframe을 사용하기 때문에 X-Frame-Options 헤더를 비활성화
			.authorizeHttpRequests(auth ->
				auth.requestMatchers(WHITE_LIST).permitAll()
					.anyRequest()
					.authenticated()
			)
			.authenticationManager(authenticationManager)
			.addFilterAt(authenticationFilter, UsernamePasswordAuthenticationFilter.class)
			.sessionManagement((session) -> session
				.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

		return http.build();
	}

	//AuthenticationManager Bean 등록
	@Bean
	public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
		return configuration.getAuthenticationManager();
	}

	@Bean
	public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

답변 2

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

답변이 늦었습니다. AI 답변이 되었지만, 추가로 몇가지 말씀드리면, 403 오류는 어려 형태로 발생될 수 있습니다. apigateway-service에서 토큰 유효성까지 모두 확인되었고, user-service로 요청이 넘어간 상태에 403 오류가 발생될 수 있습니다. 예를 들어 SecurityConfig에서 접속한 IP를 제어하고 있는 상황에서 IP 주소가 달라도 403 오류가 발생될 수 있습니다. 한가지 상황에서 발생되는 것이 아니기 때문에, 에러코드를 상세화 하여 구분하거나, 디버깅으로 403의 원인을 찾아가는 방법이 필요할 수 있습니다. 작업하신 코드와 현재 올려진 github의 코드하고는 방식이 조금 다르기 때문에, 2개를 비교하시고 라이브러리 버전과 사용되는 API를 비교하는 것도 필요할 수 있습니다. 강의 설명 부분은 이전 라이브러리 사용이고, 실습 관련해서는 작년에 업데이트 된 부분이 있기 때문에, 2개의 차이도 확인해 보시기 바랍니다. 강의 설명에 대한 최신화는 상반기 중으로 업데이트 예정입니다.

감사합니다.

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

추가로, user-service는 외부에서 직접적인 호출이 안되고, apigateway-service를 통해서만 오픈되어 있는 서비스라 가정하고 구성된 예제이기 때문에, 특별히 user-service에서 토큰 유효성을 추가하지는 않았습니다. 참고 부탁드립니다. 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

이곰님께서 올려주신 Spring Security 설정을 보니, 게이트웨이 서비스에서 토큰 검증을 수행하도록 설정되었으나, user-service 내에서 JWT 토큰을 검증하기 위한 추가적인 설정이 필요한 것 같습니다. 강의에서는 게이트웨이 서비스가 최초 요청에서 인증 및 인가를 관리하며, 인증이 완료된 요청만 user-service에 전달되도록 구성되어 있습니다.

하지만, 만일 user-service 내에서 자체적으로 토큰을 검증해야 한다면, 이를 명시적으로 설정해 주어야 합니다. 일반적으로 필요한 과정은 다음과 같습니다:

  1. JWT 필터 추가: user-service에서 JWT를 검증하는 필터를 추가해야 합니다. 게이트웨이에서 인증이 되었더라도, 토큰의 유효성 검사가 user-service 본인 내에서도 일어나야 요청을 신뢰할 수 있습니다.

  2. SecurityFilterChain 구성: SecurityFilterChain의 구성에서 JWT 필터를 명시적으로 추가하여, 각 요청에 대해 필터를 통과하도록 설정해야 합니다.

관련하여 유사한 문제를 겪었던 다른 수강생의 질문들을 통해 해결책을 확인할 수 있습니다:
- “Spring Boot Security와 JWT를 이용한 API 토큰 인증”: 여기에서 user-service 내에서 JWT 필터를 추가하는 코드를 참고하실 수 있습니다.

또한, user-service 내에서 인증이 필요하지 않은 경로들을 WHITE_LIST에 추가 해주셨지만, 이외의 경로들에 대해서는 JWT 검증 필터가 추가되어야 접근이 가능하도록 설정됩니다.

위의 이유로 인해 403 Forbidden 오류가 발생하고 있으며, 이를 해결하기 위해 user-service에서의 JWT 검증 설정을 한 번 더 검토해 주시길 권장드립니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기