sourcetip

Spring Security를 사용한 HTTPS 로그인이 HTTP로 리디렉션

fileupload 2023. 8. 16. 22:34
반응형

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

반응형