Https를 적용하기 위해서는 SSL 인증서가 필요하기 때문에 생성해야한다.
실제로 서비스를 할 때에는 인증기관에서 인증서를 사면 될 것이다.
SSL 인증서 생성
# keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat’
이렇게 되면 홈 디렉토리에 .keystore 가 생긴다.
톰캣 설정
그러면 이제 이 .kestore을 이용해서 Tomcat 설정을 해보자
Tomcat 홈 디렉토리의 conf/server.xml 로 이동한다.
지금 서비스는 http와 https를 겸해서 쓸 것이기 때문에
// 기본 http 설정
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
// https 설정
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/Users/jaeng/.keystore" keystorePass="changeit" />
위와 같은 설정을 한다. keystoreFile, keystorePass와 같은 경우에는 달라질 수 있겠다.
나머지 설정들에 대해서도 알아보면 좋을 것 같다.
Maven
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
해당하는 알맞는 버전을 이용하면 되겠다.
스프링 설정
현재 Spring 설정은 모두 java config으로 되어있는 상태이다. Java config으로 어떻게 설정을 하는지 알아보자.
SpringSecurityInitializer라는 클래스를 만들 것이다.
이 클래스는 AbstractSecurityWebApplicationInitializer 클래스를 상속하는 클래스인데
말 그대로 SecurityWebApplication을 Initialize하는 것이다.
나의 경우에는 이 클래스를 만들지 않아서 몇 시간을 씨름했었다.
이 것은 xml 설정을 할 때 web.xml에서 springSecurityFilterChain을 설정하던 부분을 대신하는 것이다.
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer{
}
이런식으로 클래스만 만들어도 알아서 작동한다.
그 다음, WebConfig 클래스를 작성한다.
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
protected Logger logger = LogManager.getLogger(this.getClass());
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requiresChannel()
.antMatchers("/api/auth/**").requiresSecure()
.antMatchers("/api/mypage/**").requiresSecure()
.antMatchers("/api/**/like").requiresSecure();
.antMatchers("/api/jobs").requiresInsecure()
}
}
많은 설정을 할 수 있겠지만, 여기서 하는 설정을 설명하자면 어떤 url에는 https를 어떤 url에는 http를 설정하는 것이다.
그래서 .requiresSecure()이 붙는 url은 https로 접근해야만 하는 것이고,
.requiresInsecure()이 붙은 url은 http로 접근하면 되는 것이다.
이렇게 설정을 하면 http와 https를 함께 사용할 수 있게 된다.