내장된 서버 선택 및 구성
# 다수의 사용 가능한 일반 서버 속성
#server.port=HTTP 서버 포트, 기본값 8080
#server.address=바인딩될 IP주소, 기본값 0,0,0,0(예, 모든 IP)
#server.use-forward-headers= spring boot 2.2에서는 deprecated 되었음
#server.jetty.max-http-form-post-size=HTTP 헤더의 최대 크기, 기본값 0(무제한)
#server.connection-timeout= deprecated
#server.http2.enabled=현재 컨테이너가 지원할 경우 http2 활성화 여부, 기본값 false
#server.compression.enabled=HTTP 압출 확성화 여부, 기본값 false
#server.compression.mime-types=압축이 적용될 MIME 유형 목록(쉼표 구분)
#server.compression.excluded-user-agents=압축이 비활성화될 사용자 에이전트 목록(쉼표 구분)
#server.compression.min-response-size=압축이 적용될 최소 요청 크기, 기본값 2048
#server.servlet.context-path=애플리케이션의 주요 컨텍스트 경로, 기본값 루트 애플리케이션
#server.servlet.application-display-name=컨테이너에서 표시 이름으로 사용될 이름, 기본값 application
#server.servlet.context-parameters.{변수}={값} 서블릿 컨테이너 컨텍스트/초기 매개변수
# JSP관련 서버속성
#server.servlet.jsp.registered=JSP 서블릿 등록되는지 여부, 기본값 true
#server.servlet.jsp.class-name=JSP 서블릿 클래스 이름, 기본값 org.apache.jasper.servlet.JspServlet이다. 톰캣,제티 둘다 JSP구현체로 자스퍼를 사용
#server.servlet.jsp.init-parameters.{매개변수}={값} JSP 서블릿의 컨텍스트 매개변수
# 매개변수 쓰는법 : https://stackoverflow.com/questions/26639475/how-to-set-context-param-in-spring-boot
# HTTP 세션 관련 서버 속성
#server.servlet.session.timeout=세션 시간 초과, 기본값 30분
#server.servlet.session.tracking-modes=세션 추적 모드, cookie,url,ssl 중 하나 이상 사용, 기본값 없음, 컨테이너 기본값 따름
#server.servlet.session.persistent=재시작시 세션 데이터 저장 여부, 기본값 false
#server.servlet.session.cookie.name=세션 식별자가 저장될 쿠키이름, 기본값 없음, 컨테이너 기본값 따름
#server.servlet.session.cookie.domain=세션 쿠키에 사용될 도메인 값, 기본값 없음, 컨테이너 기본값
#server.servlet.session.cookie.path=세션 쿠키에 사용될 경로값, 이하동일, 이하동일
#server.servlet.session.cookie.comment=세션 쿠키에 사용될 주석, 이하동일, 이하동일
#server.servlet.session.cookie.http-only=세션 쿠키가 http에서만 접근되는지 여부, 이하동일, 이하동일
#server.servlet.session.cookie.secure=쿠키가 SSL로만 전송되는지 여부, 이하동일, 이하동일
#server.servlet.session.cookie.max-age=세션 쿠키의 활성 시간, 이하동일, 이하동일
#server.servlet.session.store-dir=지속성 있는 쿠키 사용을 위한 폴더 이름으로, 존재하는 폴더여야 한다.
# SSL 관련 서버 속성
#server.ssl.enabled=SSL 활성화 여부, 기본값 true
#server.ssl.ciphers=지원되는 SSL암호, 기본값 공백
#server.ssl.client-auth=SSL 클라이언트 인증을 원하는지(WANT) 또는 필요로 하는지(NEED) 여부, 기본값 공백
#server.ssl.protocol=사용할 SSL 프로토콜, 기본값 TLS
#server.ssl.enabled-protocols=활성화될 SSL 프로토콜, 기본값 공백
#server.ssl.key-alias=키 저장소의 키를 식별할 별칭, 기본값 공백
#server.ssl.key-password=키 저장소의 키에 접근할 비번, 기본값 공백
#server.ssl.key-store=키 저장소 위치, 일반적으로 JKS 파일, 기본값 공백
#server.ssl.key-store-password=키 저장소에 접근할 비번, 기본값 공백
#server.ssl.key-store-type=키 저장소 유형, 기본값 공백
#server.ssl.key-store-provider=키 저장소 제공자, 기본값 공백
#server.ssl.trust-store=신뢰 저장소 위치
#server.ssl.trust-store-password=신뢰 저장소에 접근할 비번, 기본값 공백
#server.ssl.trust-store-type=신뢰 저장소 유형, 기본값 공백
#server.ssl.trust-store-provider=신뢰 저장소 제공자, 기본값 공백
#위의 언급된 속성은 애플리케이션 내장된 컨테이너를 사용할때만 적용
server.servlet.context-path와 server.servlet.path간에 차이가있다.
context-path는 전체 애플리케이션
path는 context-path뒤에 붙는다.
DispatcherServlet를 추가하면 path뒤에 붙는다.
SSL 구성
1) 개발목적이므로 자가 서명된 인증서 생성
★★★★★★사이트 : https://www.thomasvitale.com/https-spring-boot-ssl-certificate/
https://galid1.tistory.com/604
keytool -genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg}
alias는 이 명령으로 생성되는 인증서 체인과 개인 키에 대한 키 저장소 항목을 식별합니다. keysize는 생성되는 각 키의 크기를 지정합니다. 키 크기를 최소 112비트로 설정합니다. 가능한 경우 2048비트로 설정하십시오. keyalg는 키 쌍을 생성하기 위해 사용되는 알고리즘을 지정합니다. keyalg 알고리즘을 RSA로 설정하십시오. sigalg는 자체 서명 인증서에 서명하기 위해 사용되는 알고리즘입니다. 이 알고리즘은 keyalg와 호환 가능해야 합니다. -sigalg 인수가 올바른 SHA2 값이 되도록 설정하십시오. 예를 들어, RSA가 keytool 명령에 대한 -keyalg 인수에 사용되는 값인 경우 -sigalg SHA256withRSA를 사용하십시오. SHA384 및 SHA512 역시 올바른 값입니다.
-genkeypair 명령은 Java SE 6 이전 릴리스에서 -genkey 이름으로 지정되었습니다. 이 이전 이름은 계속 지원되지만 새 이름을 더 선호합니다.
PS C:\Users\k\Documents\key> keytool -genkeypair -alias tomcat -keyalg RSA -keysize 4096 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass password
What is your first and last name?
[Unknown]: None
What is the name of your organizational unit?
[Unknown]: None
What is the name of your organization?
[Unknown]: None
What is the name of your City or Locality?
[Unknown]: None
What is the name of your State or Province?
[Unknown]: None
What is the two-letter country code for this unit?
[Unknown]: ko
Is CN=None, OU=None, O=None, L=None, ST=None, C=ko correct?
[no]: yes
server.port=8443
server.ssl.key-store=classpath:ssl/keystore.p12
server.ssl.key-store-password=password
server.ssl.key-store-type=pkcs12
server.ssl.key-alias=tomcat
server.ssl.key-password=password
https://localhost:8443 로 테스트
결과)
8080포트와 8443포트 이중으로 쓰기
package com.example.demo.library;
import org.apache.catalina.connector.Connector;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class connectorConfig {
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
var factory = new TomcatServletWebServerFactory();
factory.addAdditionalTomcatConnectors(httpConnector());
return factory;
}
private Connector httpConnector() {
var connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
return connector;
}
/*
명시적으로 TomcatServletWebServerFactory 를 구성하길 원하지 않으면 TomcatServletWebServerFactory에 추가 톰캣 Connector를
등록하기 위해 BeanPostProcessor 를 사용할 수 있다.
이 방법으로 하나의 컨테이너에 묶이지 않고, 다른 내장된 컨테이너에 구현할 수 있다.
*/
// @Bean
// public BeanPostProcessor addHttpConnectorProcessor(){
// return new BeanPostProcessor() {
// @Override
// public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// if(bean instanceof TomcatServletWebServerFactory){
// var factory = (TomcatServletWebServerFactory)bean;
// factory.addAdditionalTomcatConnectors(httpConnector());
// }
// return bean;
// }
// };
// }
}
시도) http://localhost:8080/ 으로 접속하면된다.
결과) 성공
HTTP를 HTTPS로 리디렉션
package com.example.demo.library;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class connectorConfig {
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
var factory = new TomcatServletWebServerFactory();
factory.addAdditionalTomcatConnectors(httpConnector());
factory.addContextCustomizers(securityCustomizer());
return factory;
}
private Connector httpConnector() {
var connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
private TomcatContextCustomizer securityCustomizer() {
return context -> {
var securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
var collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
};
}
}
모든 URL을 SecurityConstraint로 보호해야 한다.
스프링 부트에서 특수한 TomcatContextCustomizer 를 사용해 톰캣이 시작하기 전 컨텍스트의 사전 처리를 할 수 있게 한다.
모든요청(/*)을 기밀(NONE, INTEGRAL, CONFIDENTIAL이 가능)로 만든다.
'WEB > 스프링 부트 2' 카테고리의 다른 글
비동기 Emitter (0) | 2020.02.06 |
---|---|
Jetty SSL, Http to Https (0) | 2020.02.06 |
Messages.properties (0) | 2020.02.05 |
타임리프(thymeleaf) (0) | 2020.02.04 |
스프링 MVC (0) | 2020.02.04 |