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

ello님의 프로필 이미지
ello

작성한 질문수

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

Users Microservice - Routes 테스트

비교적 최신 버전에서 에러가 발생합니다.

작성

·

5K

1

에러 내용을 자세하게 이해하진 못했지만 사용중인 임베디드 톰캣 버전에서 `hasIpAddress` 를 찾지 못하는 것 같습니다.

스프링 버전은 2.6.2 사용중이고, starter-security 그대로 사용하고 있습니다. `hasIpAddress` 대신 다른 메서드를 사용하면 가능은 한데 의도한 것과 다른 것 같아서 남깁니다.

java.lang.UnsupportedOperationException: public abstract java.lang.String javax.servlet.ServletRequest.getRemoteAddr() is not supported

at org.springframework.security.web.FilterInvocation$UnsupportedOperationExceptionInvocationHandler.invoke(FilterInvocation.java:326) ~[spring-security-web-5.6.1.jar:5.6.1]

at com.sun.proxy.$Proxy150.getRemoteAddr(Unknown Source) ~[na:na]

at javax.servlet.ServletRequestWrapper.getRemoteAddr(ServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.56.jar:4.0.FR]

at org.springframework.security.web.util.matcher.IpAddressMatcher.matches(IpAddressMatcher.java:65) ~[spring-security-web-5.6.1.jar:5.6.1]

답변 11

5

위에 분이 올려주신 https://github.com/spring-projects/spring-boot/issues/29820 참고하여 확인해보니 에러 페이지를 리턴하는 부분에서 /error 에 대한 request는 ServletRequest가 아닌 DummyRequest 로 넘어가는 것을 확인했습니다. 

이 클래스는 getRemoteAddress()를 지원하지 않고요. 위와 같은 에러를 확인하신 분들은 뭔가 다른 에러가 있었고 이 에러로 인해 /error 페이지를 재요청하는데 이때 hasIpAddress() 권한체크로 인해 발생하셨을 거 같습니다. 

결론적으로 java.lang.UnsupportedOperationException: public abstract java.lang.String javax.servlet.ServletRequest.getRemoteAddr() 이 에러는 /error에 대한 요청의 권한을 체크하면서 발생한 부분이어서 /error에 대한 부분만 permitAll()로 수정했습니다.

http.authorizeRequests()
.antMatchers("/error/**").permitAll()
.antMatchers("/**")
.hasIpAddress("자신의 IP")
.and()
.addFilter(getAuthenticationFilter())
;

 

아예 errorPageSeucirytFilter를 제거하는 방법도 있습니다.

https://github.com/spring-projects/spring-security/issues/11055#issuecomment-1098061598

5

스프링 최신 버전 (현재 2.6.4) 으로 아래와 같이 수정하여 해결했습니다.

        http.authorizeRequests().antMatchers("/**")
                .access("hasIpAddress('" + IP_ADDRESS + "')")             //  IP_ADDRESS="x.x.x.x"
                .and()
                .addFilter(getAuthenticationFilter());

 

관련 출처 : https://sarc.io/index.php/java/1857-spring-boot-security

2

저는 위 방안들이 다 작동하지 않아서

https://stackoverflow.com/questions/72366267/matching-ip-address-with-authorizehttprequests

위 링크를 참고하였습니다!

스프링 2.7.6 입니다 :)

1

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.7.1



버전: 2.7.1 기준

 

.hasIpAddress("각자IP주소입력")

위 코드를 아래 코드로 바꾸면 됩니다.

.access("hasIpAddress('"+IP+"')"

1

SpringBoot 2.7에서도 동일한 이슈가 발생했었습니다.

결국 질문하신 이상한 상태의 에러가 리턴되는 원인은 윗분이 설명하신 것이 맞습니다.

다만 제 경우에는 이런 에러가 발생한게

UserDetails 구현체에서 유저를 찾지 못해서 UsernameNotFoundException을 발생시키면 이런 현상이 발생했습니다.

그 원인에 대한 설명은

https://www.inflearn.com/questions/224106

여기에 되어있습니다.

0

시큐리티 이슈가 있는것 같습니다.
https://github.com/spring-projects/spring-boot/issues/29820

https://github.com/spring-projects/spring-security/milestone/245

버전 내리는걸 추천합니다.
boot -> 

<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.11</version>
<spring-cloud.version>2020.0.5</spring-cloud.version>

0

이거 해결하셨나요 .. 같은 문제가 발생하는데

0

저도 동일한 오류가 발생하네요 스프링버전은 2.6.4입니다..

0

ello님의 프로필 이미지
ello
질문자

제가 최근까지 작업 (아직 dockerizing 중이라 확정은 아님)해둔  pom.xml입니다.

아무래도 뭔가 배우는데 있어서 버전을 같이 가져가는게 좋을 것 같아서 변경할까 고민하기도 했습니다만, 굳이 기존 버전을 가기엔 좀 그런거 같아서 제보를 드린 것이기도 하구요.

https://github.com/spring-projects/spring-security/issues/10664

위 이슈가 검색이 되던데, 연관이 있을지는 모르겠네요. 원인은 같아서 비슷하리라 생각합니다.


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>1.0</version>
<name>user-service</name>
<description>user-service</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2021.0.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.8.2</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>

0

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

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

작업하신 내용을 보면, Spring Boot  2.6.2 버전, Spring Cloud 2021.0.0 버전인 것 같습니다. 강의가 Spring Boot 2.5.x 버전과 Spring Cloud 2020.0.x 버전까지만 확인한 상태라, 최신 버전으로 변경하여 user-service를 기동시켜 보았을 때 말씀한신 에러가 재현되지 않았습니다. 해당 Spring Boot의 버전업이 원인인것 같은데, 올려주신 에러만으로는 원인을 찾기가 쉽지 않네요. 작업하신 pom.xml 파일을 공유해 주시면 다시한번 확인해 보도록 하겠습니다. 

참고로 제가 작업한 pom.xml 파일을 공유해 드립니다. 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2021.0.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.8</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bus-amqp</artifactId>-->
<!-- </dependency>-->

<!-- Feign Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- resilience4j -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>

<!-- zipkin -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-sleuth</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-zipkin</artifactId>-->
<!-- <version>2.2.3.RELEASE</version>-->
<!-- </dependency>-->

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>

감사합니다. 

-2

저는 스프링 부트 2.7.1 사용 중이고, 스프링 시큐리티는 5.7대 버전입니다.

공식문서 보고 해결했습니다.

image

https://www.baeldung.com/spring-security-whitelist-ip-range

ello님의 프로필 이미지
ello

작성한 질문수

질문하기