http 가 아닌 https 통신을 하기위해 로컬에 SSL 적용하는 법을 정리했다.
일반적인 정보는 Http로 통신해도 상관이 없지만, 개인정보나 ID/PW 같은 민감한 정보는 암호화를 통해 통신을 해야하기에 SSL을 적용해보고자 한다.
Java에는 릴리스에 keytool 유틸리티가 포함되어 있으므로 굳이 따로 설치할 필요는 없다.
아래 명령어를 이용하여 만들자
keytool -genkey -alias bmex-ssl -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore bmaxkeystore.p12 -validity 3650
- -alias bmex-ssl : alias 를 bmex-ssl 로 지정
- -keystore bmaxkeystore.p12 : 키스토어를 bmaxkeystore.p12 로 지정
생성되면 프로젝트 폴더에 키스토어가 생긴다.
application.properties 에 SSL 설정을 해준다
# SSL Config
server.http.port=8080
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=bmaxkeystore.p12
server.ssl.key-store-password=000000
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=bmex-ssl
security.require-ssl=true
설정 후 실행
아래와 같이 뜬다.
해당 포트(8080)는 이제 더이상 http 요청을 받지않도록 설정했기 때문이다.
하지만 나는 프로젝트에서 HTTP , HTTPS 요청 2개다 받고 싶다.
로컬에서 진행하므로 나는 내장된 톰캣의 설정을 변경하는 방법으로 가겠다.
1. 톰캣 커넥터 생성
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
//collection.addPattern("/*");
collection.addPattern("/api/auth/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(httpPort);
connector.setRedirectPort(httpsPort);
return connector;
}
모든 URL 에 Https 를 적용하고 싶다면 collection.addPattern 에 "/*" 를 추가하면 된다.
하지만 나는 로그인과 비밀번호 변경등 특정 URL 에만 Https 를 적용하고자 하기에 따로 설정하였다.
2. (생성 후 HTTPS 를 postman에서 테스트) setting option 에서 SSL인증 검증 체크를 꺼야 SSL Error를 보지 않는다.
3. (Swagger 에서 확인) 옵션 설정에서 서버 하나를 더 추가한다.
@OpenAPIDefinition(
servers = {@Server(url = "${server.springdoc.httpURL}", description = "Default Server URL"),
@Server(url = "${server.springdoc.httpsURL}", description = "HTTPS Server URL") },
* CORS 설정을 통해 설정하는 방법도 있으나, 통신시에 그냥 Https / Http 인지 유저가 구분만 해주면 되기에 딱히 설정하진 않았다.
-끝-
참고 :
https://velog.io/@code12/Spring-Security-SSLHTTPS-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
'web > SpringBoot' 카테고리의 다른 글
Properties 암호화하기 (0) | 2023.10.12 |
---|---|
HttpOnly + Secure Cookies 생성 (0) | 2023.09.12 |
Maven VS Gradle (0) | 2023.09.07 |
ErrorContoller 오류처리 (0) | 2023.09.06 |
Global Exception 처리 (0) | 2023.09.06 |