Spring HTTP / HTTPS 채널 보안

1. 개요

이 튜토리얼은 HTTPS를 사용하여 Spring의 채널 보안 기능을 사용하여 애플리케이션의 로그인 페이지를 보호하는 방법을 보여줍니다 .

인증에 HTTPS를 사용하는 것은 전송시 민감한 데이터의 무결성을 보호하는 데 중요합니다.

이 기사는 보안 계층을 추가하여 Spring Security Login 튜토리얼을 기반으로 작성되었습니다. 인코딩 된 HTTPS 채널을 통해 로그인 페이지를 제공하여 인증 데이터를 보호하는 데 필요한 단계를 강조합니다.

2. 채널 보안없이 초기 설정

앞서 언급 한 문서에서 설명한 보안 구성부터 시작하겠습니다.

웹 앱을 통해 사용자는 다음에 액세스 할 수 있습니다.

  1. /anonymous.html 인증없이
  2. /login.html
  3. 로그인 성공 후 다른 페이지 ( /homepage.html )

액세스는 다음 구성에 의해 제어됩니다.

@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/anonymous*") .anonymous(); http.authorizeRequests() .antMatchers("/login*") .permitAll(); http.authorizeRequests() .anyRequest() .authenticated(); 

또는 XML을 통해 :

이 시점에서 로그인 페이지는 다음 위치에서 사용할 수 있습니다.

//localhost:8080/spring-security-login/login.html

사용자는 HTTP를 통해 자신을 인증 할 수 있지만 비밀번호가 일반 텍스트로 전송되므로 안전하지 않습니다.

3. HTTPS 서버 구성

단지 HTTPS를 통해 로그인 페이지를 제공하기 위해 - 웹 서버가 HTTPS 페이지를 제공 할 수 있어야합니다 . SSL / TLS 지원이 활성화되어 있어야합니다.

유효한 인증서를 사용하거나 테스트 목적으로 직접 생성 할 수 있습니다.

Tomcat을 사용하고 자체 인증서를 롤링한다고 가정 해 보겠습니다. 먼저 자체 서명 된 인증서 로 키 저장소 를 만들어야합니다 .

터미널에서 다음 명령을 실행하여 키 저장소를 생성 할 수 있습니다.

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

이렇게하면 홈 폴더의 사용자 프로필에 대한 기본 키 저장소에 개인 키와 자체 서명 된 인증서가 생성됩니다.

다음 단계는 conf / server.xml 을 편집 하여 다음과 같이 만드는 것입니다.

두 번째 SSL / TLS 태그는 일반적으로 구성 파일에서 주석 처리되므로 주석 처리를 제거하고 키 저장소 정보를 추가하기 만하면됩니다. 추가 정보는 Tomcat의 관련 문서에서 사용할 수 있습니다.

HTTPS 구성을 사용하면 이제 다음 URL에서도 로그인 페이지를 제공 할 수 있습니다.

//localhost:8443/spring-security-login/login.html

Tomcat 이외의 웹 서버에는 다르지만 유사한 구성이 필요합니다.

4. 채널 보안 구성

이 시점에서 우리는 HTTP와 HTTPS 모두에서 로그인 페이지를 제공 할 수 있습니다. 이 섹션에서는 HTTPS 사용을 의무화하는 방법을 설명합니다.

로그인 페이지에 HTTPS를 요구하려면 다음을 추가하여 보안 구성을 수정하십시오.

http.requiresChannel() .antMatchers("/login*").requiresSecure();

또는 XML 구성에 requires-channel =”https” 속성을 추가합니다.

이 시점 이후 사용자는 HTTPS를 통해서만 로그인 할 수 있습니다. 모든 관련 링크 (예 : /homepage.html 로의 전달) 는 원래 요청의 프로토콜을 상속하고 HTTPS에서 제공됩니다.

단일 웹 앱 내에서 HTTP 및 HTTPS 요청을 혼합 할 때 알아야 할 추가 측면이 있으며 추가 구성이 필요합니다.

5. HTTP와 HTTPS 혼합

보안 관점에서 HTTPS를 통해 모든 것을 제공하는 것은 좋은 습관이며 확실한 목표입니다.

그러나 HTTPS를 독점적으로 사용하는 것이 옵션이 아닌 경우 구성에 다음을 추가하여 HTTP를 사용하도록 Spring을 구성 할 수 있습니다.

http.requiresChannel() .anyRequest().requiresInsecure();

또는 XML 에 requires-channel =”http” 속성을 추가 합니다 .

이것은 Spring이 HTTPS를 사용하도록 명시 적으로 구성되지 않은 모든 요청에 ​​대해 HTTP를 사용하도록 지시하지만 동시에 원래 로그인 메커니즘을 손상시킵니다. 다음 섹션에서는 근본적인 원인을 설명합니다.

5.1. HTTPS를 통한 사용자 지정 로그인 처리 URL

원래 보안 자습서의 보안 구성에는 다음이 포함됩니다.

/ perform_login 이 HTTPS를 사용 하도록 강요하지 않으면 HTTP 변형에 리디렉션이 발생 하여 원래 요청과 함께 전송 된 로그인 정보가 손실 됩니다.

이를 극복하려면 처리 URL에 HTTPS를 사용하도록 Spring을 구성해야합니다.

http.requiresChannel() .antMatchers("/login*", "/perform_login");

Notice the extra argument /perform_login passed to the antMatchers method.

The equivalent in the XML configuration requires adding a new <intercept-url> element to the config:

If your own application is using the default login-processing-url (which is /login) you don't need to configure this explicitly as the /login* pattern already covers that.

With the configuration in place, users are able to login, but not to access authenticated pages e.g. /homepage.html under the HTTP protocol, because of Spring's session fixation protection feature.

5.2. Disabling session-fixation-protection

Session fixation is a problem which can't be avoided when switching between HTTP and HTTPS.

By default Spring creates a new session-id after a successful login. When a user loads the HTTPS login page the user's session-id cookie will be marked as secure. After logging in, the context will switch to HTTP and the cookie will be lost as HTTP is insecure.

To avoid this setting session-fixation-protection to none is required.

http.sessionManagement() .sessionFixation() .none();

Or via XML:

Disabling session fixation protection might have security implications, therefore you need to weigh the pros and cons if you're concerned about session fixation based attacks.

6. Test

After applying all these configuration changes accessing /anonymous.html without logging in (using either // or //) will forward you to the page through HTTP.

Opening other pages directly like /homepage.html should get you forwarded to the login page via HTTPS and after login you will be forwarded back to /homepage.html using HTTP.

7. Conclusion

이 튜토리얼에서는 로그인 메커니즘을 제외하고 HTTP를 통해 통신하는 Spring 웹 애플리케이션을 구성하는 방법을 살펴 보았습니다. 그러나 새로운 최신 웹 애플리케이션은 거의 항상 통신 프로토콜로 HTTPS를 독점적 으로 사용해야 합니다. 보안 수준을 낮추거나 보안 기능 (예 : session-fixation-protection )을 끄는 것은 결코 좋은 생각이 아닙니다.

이 자습서는 GitHub에서 제공되는 코드베이스를 기반으로합니다. 채널 보안 구성은 https 를 활성 Spring 프로필로 나열하여 활성화 할 수 있습니다 .