Spring Security를 사용한 HTTPS 로그인이 HTTP로 리디렉션
스프링 보안으로 보안된 스프링 웹 앱이 EC2에서 실행되고 있습니다.EC2 인스턴스 앞에는 SSL 인증서(https는 로드 밸런서의 포트 443 -> 포트 80에서 종료됨)가 있는 탄력적 로드 밸런서가 있으므로 Tomcat의 관점에서 인바운드 요청은 HTTP입니다.
로그인 양식이 https에 제출되지만 이후 리디렉션은 http(성공 또는 실패)로 이동합니다.인증에 성공하여 https로 돌아가서 로그인할 수 있습니다.
내 로그인 구성은 다음과 같습니다.
<security:form-login
default-target-url="/home"
login-page="/"
login-processing-url="/processlogin"
authentication-failure-url="/?login_error=1"/>
default-target-url 및 authentication-failure-url을 https로 이동하려면 무엇을 변경해야 합니까?
- 톰캣 6
- Spring Security 3.0.x
스프링 구성은 사용된 프로토콜에 구애받지 않아야 합니다."필수 채널"과 같은 것을 사용하는 경우, 특히 https가 없는 개발 환경에 동일한 애플리케이션을 배포하려는 경우 조만간 문제가 발생할 수 있습니다.
대신 Tomcat을 올바르게 구성하십시오.RemoteIpValve를 사용하여 이 작업을 수행할 수 있습니다.loadbalancer가 보내는 헤더에 따라 server.xml 구성에 다음과 같은 내용이 포함되어야 합니다.
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies=".*"
protocolHeader="X-Forwarded-Proto"
httpsServerPort="443"
/>
Spring은 ServletRequest를 기반으로 절대 리디렉션 주소를 결정하므로 443이 아닌 다른 주소를 사용하는 경우 httpsServerPort를 변경합니다.
httpsServerPort는 protocolHeader가 https 프로토콜을 나타낼 때 ServletRequest.getServerPort()에서 반환하는 포트입니다.
Spring Boot 애플리케이션인 경우(현재 2.0.0 릴리스 사용),application.properties
파일로 충분해야 합니다.
server.tomcat.protocol-header=x-forwarded-proto
이것은 로드 밸런서가 전면에 있는 AWS에서 작동했습니다.
Spring Boot < 2.0.0의 경우에도 작동해야 합니다(테스트되지 않음).
Google Kubernetes 뒤에 있는 Spring Boot에서도 같은 문제가 있었습니다.이 두 줄을 application.properties에 추가하는 것이 저에게 도움이 되었습니다.
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
출처: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https
솔루션은 두 가지로 구성되었습니다.
application.yml
server:
use-forward-headers: true
서버에서/etc/apache2/sites-enabled/oow.com-le-ssl.conf
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-Port 443
(2.1)을 사용하여 Apache 모듈을 활성화했습니다.
sudo a2enmod headers
이 작업을 수행하는 한 가지 방법은 다음 구성을 추가하는 것입니다.
<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" >
<form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" />
<logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" />
...
</http>
을 추가해야 .always-use-default-target="true"
그리고.default-target-url="https://...."
구성에서 URL을 하드 코딩해야 하므로 이상적인 방법은 아닙니다.
모든 인터셉트 신호에 requires-channel="any"를 설정합니다.이를 통해 SSL을 사용하지 않는 개발 환경에서도 작동할 수 있습니다.
<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/>
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/>
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/>
그런 다음 모든 트래픽을 HTTPS 버전으로 리디렉션하는 Apache 가상 호스트를 생성합니다.
<VirtualHost *:80>
ServerName www.mywebsite.com
Redirect permanent / https://www.mywebsite.com/
</VirtualHost>
저는 또한 정확히 같은 문제에 직면하고 있으며 적절한 솔루션을 얻을 때까지 HTTP 대신 AJP를 통해 프록시 서버에서 Tomcat 서버로 요청을 리디렉션하고 있습니다.다음은 Apache 구성입니다.
ProxyPass /myproject ajp://localhost:8009/myproject
ProxyPassReverse /myproject ajp://localhost:8009/myproject
web.xml의 아래 줄 코드 사용
<security-constraint>
<web-resource-collection>
<web-resource-name>Login and Restricted Space URLs</web-resource-name>
<url-pattern>/j_security_check</url-pattern>
<url-pattern>/loginpage.rose</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
HTTPS를 사용하도록 강요합니다.
제 경우에는, 그 부동산을 제거해야 했습니다.server.use-forward-headers=true
.
내 설정은 다음과 같습니다.
디지털 Ocean LB --> Kubernetes 클러스터(입력 기능 포함) --> Spring boot 응용 프로그램
내 k8의 스프링 부트 애플리케이션에 대해 위에서 언급한 모든 것을 시도해 보았더니, 문제는 k8이 보안되었고 SSL은 입력 앞에 앉은 SSL 가속기에 의해 처리되었습니다.응용 프로그램은 http 요청만 수신하고 봄 보안도 http로 전달했지만, 찾을 수 없었습니다.나에게 효과적인 솔루션:
nginx.ingress.kubernetes.io/proxy-redirect-from : http://$https_host/ nginx.ingress.kubernetes.io/proxy-redirect-to : https://$https_host/$helloworld-service/
언급URL : https://stackoverflow.com/questions/10385977/https-login-with-spring-security-redirects-to-http
'sourcetip' 카테고리의 다른 글
event.preventDefault()를 사용한 후 이벤트를 트리거하는 방법 (0) | 2023.08.21 |
---|---|
IMG dir는 db에 저장할 수 없지만 쿼리에 사용된 동일한 변수에서 볼 수 있습니다. (0) | 2023.08.21 |
유형 및 이름별 대상 입력(계속) (0) | 2023.08.16 |
Android 앱의 그리드 보기 VS 그리드 레이아웃 (0) | 2023.08.16 |
CSV에 한 줄씩 쓰는 방법은 무엇입니까? (0) | 2023.08.16 |