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

ygh님의 프로필 이미지
ygh

작성한 질문수

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

Users Microservice에서 Spring Cloud Config 연동 ➁

안녕하세요! 질문있습니다.

작성

·

504

0

안녕하세요. 좋은 강의 감사드립니다 :)

강의 19:23초경에 엔드포인트를 /health_check로 두고 get 요청을 날리셨는데, user-service의 WebSecurity에서 권한을 막아놓은 요청아닌가요?

어떻게 access denied가 발생하지 않았는지 궁금합니다.

답변 2

1

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

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

user-service 애플리케이션에 직접 /health_check를 요청하는 것에 대해서는 접근 권한을 막지 않고 있습니다. 

http.authorizeRequests().antMatchers("/**")
.hasIpAddress(env.getProperty("gateway.ip")) // <- IP 변경
.and()
.addFilter(getAuthenticationFilter());

위 코드에서 보시는 것처럼, 모든 요청에 대해 IP를 체크한 다음, Filter를 적용하고 있습니다. UsernamePasswordAuthenticationFilter를 구현한 AuthenticationFilter를 통해 /login endpoint를 사용할 수 있으며,  user-service에서는 모든 요청(/**)에 대해 AuthenticationFilter를 적용하도록 하고 있습니다. 만약 AuthenticationFilter를 적용하지 않으면, Spring Security에서 제공하는 /login을 사용하지 못해, 직접 로그인 관련된 기능을 구현하시거나, formLogin을 사용하셔야 합니다. 강의에서는 Postman으로 테스트하고 있기 때문에, 별다른 Login 폼 없이, Spring Security에서 제공하는 /login을 사용하고 있습니다.

user-service에서 구현한 endpoints에 대한 액세스 가능 여부는, 로그인 후 발급 된 토큰(JWT) 정보를 Spring Cloud Gateway(apigateway)에서 확인 한 다음, 정상적인 JWT일 경우 user-service로 요청을 전달하고 있습니다. 

만약 user-service에서 직접 액세스를 제어하실려면, 다음과 같은 코드를 이용하여 확인해 보실 수 있습니다. 

http.authorizeRequests().antMatchers("/users")
.hasIpAddress(env.getProperty("gateway.ip")) // <- IP 변경
.and()
.addFilter(getAuthenticationFilter());

http.authorizeRequests().anyRequest().denyAll();

- apigateway에서 호출, http://[server ip]:8000/user-service/users -> OK

- apigateway에서 호출, http://[server ip]:8000/user-service/welcome -> Fail

- user-service에서 호출, http://[server ip]:64768/welcome -> Fail

/users 요청에 대해 GET/POST, /login 처리는 가능하며, 나머지 요청에 대해서는 모두 거부하는 것을 확인해 보실 수 있을 겁니다. 

감사합니다. 

0

안녕하세요! 질문있습니다.

안녕하세요. 좋은 강의 감사드립니다 :)

강의 19:23초경에 엔드포인트를 /health_check로 두고 get 요청을 날리셨는데, user-service의 WebSecurity에서 권한을 막아놓은 요청아닌가요?

어떻게 access denied가 발생하지 않았는지 궁금합니다.

Dowon Lee
Dowon Lee2021.05.13 PM 16:44

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

user-service 애플리케이션에 직접 /health_check를 요청하는 것에 대해서는 접근 권한을 막지 않고 있습니다. 

http.authorizeRequests().antMatchers("/**")
.hasIpAddress(env.getProperty("gateway.ip")) // <- IP 변경
.and()
.addFilter(getAuthenticationFilter());

위 코드에서 보시는 것처럼, 모든 요청에 대해 IP를 체크한 다음, Filter를 적용하고 있습니다. UsernamePasswordAuthenticationFilter를 구현한 AuthenticationFilter를 통해 /login endpoint를 사용할 수 있으며,  user-service에서는 모든 요청(/**)에 대해 AuthenticationFilter를 적용하도록 하고 있습니다. 만약 AuthenticationFilter를 적용하지 않으면, Spring Security에서 제공하는 /login을 사용하지 못해, 직접 로그인 관련된 기능을 구현하시거나, formLogin을 사용하셔야 합니다. 강의에서는 Postman으로 테스트하고 있기 때문에, 별다른 Login 폼 없이, Spring Security에서 제공하는 /login을 사용하고 있습니다.

user-service에서 구현한 endpoints에 대한 액세스 가능 여부는, 로그인 후 발급 된 토큰(JWT) 정보를 Spring Cloud Gateway(apigateway)에서 확인 한 다음, 정상적인 JWT일 경우 user-service로 요청을 전달하고 있습니다. 

만약 user-service에서 직접 액세스를 제어하실려면, 다음과 같은 코드를 이용하여 확인해 보실 수 있습니다. 

http.authorizeRequests().antMatchers("/users")
.hasIpAddress(env.getProperty("gateway.ip")) // <- IP 변경
.and()
.addFilter(getAuthenticationFilter());

http.authorizeRequests().anyRequest().denyAll();

- apigateway에서 호출, http://[server ip]:8000/user-service/users -> OK

- apigateway에서 호출, http://[server ip]:8000/user-service/welcome -> Fail

- user-service에서 호출, http://[server ip]:64768/welcome -> Fail

/users 요청에 대해 GET/POST, /login 처리는 가능하며, 나머지 요청에 대해서는 모두 거부하는 것을 확인해 보실 수 있을 겁니다. 

감사합니다. 

ygh님의 프로필 이미지
ygh

작성한 질문수

질문하기