1. X-Application-Context Header????

 - response header를 보면, 아래와 같은 header 값이 있다. 

 - application name과 port가 노출된다.

X-Application-Context:
application:8080


 - 사용자에게 알려줄 필요없는 정보다.

 - 지우자!!


2. 옵션 설정

management:
add-application-context-header: false

3. 참고 

 - 해당 Header 값은 OncePerRequestFilter에서 ApplicationContext ID를 추가한다.

1. Goal

 - spring boot에 spring-boot-starter-web를 사용 중이다.

 - was가 initialization을 마친 뒤 첫 호출 시점에 dispatcherServlet이 initialization을 한다.

 - was가 initialization을 할 동안 같이 dispatcherServlet이 initialization을 했으면 좋겠다.


2. Log

2018-02-14 13:43:58 [user-PC] [INFO ] o.a.c.c.C.[Tomcat].[localhost].[/]:179 - Initializing Spring FrameworkServlet 'dispatcherServlet'

2018-02-14 13:43:58 [user-PC] [INFO ] o.s.web.servlet.DispatcherServlet:489 - FrameworkServlet 'dispatcherServlet': initialization started

2018-02-14 13:43:58 [user-PC] [INFO ] o.s.web.servlet.DispatcherServlet:508 - FrameworkServlet 'dispatcherServlet': initialization completed in 17 ms


3-1. 수정

 1) jdk 1.8 이하

@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {

@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bean = beanFactory.getBeanDefinition(
DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);

bean.getPropertyValues().add("loadOnStartup", 1);
}
};
}


 2) jdk 1.8 이상

@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return beanFactory -> {
BeanDefinition bean =
beanFactory.getBeanDefinition(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
bean.getPropertyValues().add("loadOnStartup", 1);
};
}


3-2. 수정(추천!!)

 - application.yml에 해당 내용 추가. (기본으로 -1로 되어 있다.)

spring:
mvc:
servlet:
load-on-startup: 1

  - application.properties일 경우

spring.mvc.servlet.load-on-startup=1


* 참고자료

https://stackoverflow.com/questions/31322670/how-to-configure-dispatcherservlet-load-on-startup-by-spring-boot

1. HSTS란?

 - HTTPS를 강제하는 사이트의 경우 HTTP로 접근할 때, 302 Redirect 하는 경우가 많다. 이렇게 될 경우 취약점이 발생한다. (SSL Strip Attack : 하단참고)

 - 유저(브라우저)에게 HTTPS 요청만 허용함을 알려주는 것을 HSTS라고 함.(응답 Header에 추가함.)

 - HSTS는 서버 응답 Header를 통해 등록이 이루어질수도 있지만, Google, Paypal, Twitter의 경우는 크롬 브라우저에 HSTS가 Preload 되도록 강제화 되어있음.

https://www.chromium.org/hsts


* HTTPS로 강제 Redirect 하는 법(Nginx)

return 301 https://$host$request_uri;


* SSL Strip Attack이란?

 - SSL이 적용되어 있는 페이지에 공격자가 공격 대상의 HTTP Request를 스니핑 하여 SSL을 공격하는 방법

 - [공격대상] <- HTTP -> [공격자] <- HTTPS -> [HTTPS Server]

 - 자세한 내용은 구글 검색 ^_^


2. HSTS 설정방법

 1) HTTP Header

Strict-Transport-Security "max-age=86400; includeSubdomains; preload";

 

 - 옵션 설명

옵션명 

설명 

비고 

max-age

 HSTS가 브라우저에 설정될 시간 값 

초단위로 설정, Ex) 60*60*24 = 86,400 = 1day 

 includeSubdomains

 HSTS가 적용될 도메인의 서브 도메인 적용 여부

해당값을 추가하게되면 example.com-> www.example.com, test.example.com까지 확장되어 적용됩니다. 

 preload

 HSTS가 브라우저 측에서 Preload 적용여부

추가시 브라우저 preload list에 추가됩니다. 


  (1) apache httpd

Header always set Strict-Transport-Security "max-age=86400; includeSubdomains; preload"

  (2) nginx

add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";


 2) 설정 확인


 


3. HSTS 해제방법

 - 강제로 HSTS를 삭제하는 방법, 사용자의 브라우저에서 삭제해야함.


 1) 서버에서

  (1) apache httpd

Header always set Strict-Transport-Security "max-age=0;"


  (2) nginx

add_header Strict-Transport-Security "max-age=0";


 2) Chrome

chrome://net-internals/#hsts


 


 - Delete domain security policies 에 삭제할 도메인 입력 후 DELETE 버튼 클릭

 - Query HSTS/PKP domain 에 삭제한 도메인 입력 후 Query 버튼 클릭

 - 결과는 'Not Found'가 나온다.


4. TIP

 - HSTS를 추가하면 max-age 값 동안 적용되므로, 테스트 환경에서 max-age를 짧게 잡고, 충분히 테스트 한 후 max-age를 늘리세요.



* 참고링크

 - https://lesstif.gitbooks.io/web-service-hardening/content/ssl-tls-https.html

 - https://rsec.kr/?p=315

 - https://www.ibm.com/support/knowledgecenter/ko/SSEQTJ_9.0.0/com.ibm.websphere.ihs.doc/ihs/tihs_hsts.html


'프로그래밍 > 일반' 카테고리의 다른 글

좋은 코드 작성하기.  (0) 2018.05.01
HSTS(HTTP Strict Transport Security) 개념과 설정  (0) 2018.03.08

 개발을 하다보면 <input type="text" readonly/>와 같은 'readonly' 옵션을 '<select/'> or '<input type="checkbox">' 에 넣고 싶을 때가 있다.  (disable을 사용하면 값이 설정되지 않아. 불편하다)



'프로그래밍 > html & css' 카테고리의 다른 글

Bootstrap 사용하기  (0) 2018.08.08
textarea 리사이즈 관련  (0) 2018.07.16
radio, checkbox clear 버튼 만들기.  (0) 2018.04.25
<html lang="ko">  (0) 2018.04.09
html tag(select box, checkbox) Readonly(?)처럼 사용하기  (0) 2018.03.08

1. 에러메시지

Error:java: javacTask: source release 8 requires target release 1.8


2. 해결방법

 1) 설정변경

  - File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler 

  - 아래 이미지 내에 'target bytecode version' 옵션 1.8로 변경

  



 2) Maven을 사용할 경우

  - 아래소스 pom.xml에 추가

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>


자바스크립트에서는 replaceAll이 없다. 그래서 다른 방법으로 사용해야한다.


1. 기존 replace

var str = "TEST : Sample TEST text";
var replaceStr = str.replace("TEST","Test"); // TEST라는 텍스트를 Test으로 변경
console.log("replaceStr : ", replaceStr);

- 결과값

replaceStr :  Test : Sample TEST text


- 첫번째 조건만 변경하고 멈춘다.


2. replaceAll 사용하기

1) string prototype 메소드 추가해서 사용하기

 - searchStr을 구분자로 분리(split)한 다음, replacement라는 연결자로 연결(join)하는 형태

/**
* String prototype replaceAll 추가
* - searchStr을 구분자로 분리(split)한 다음, replacement라는 연결자로 연결(join)하는 형태
*
* @param searchStr : 바꾸려는 String
* @param replacement : 바꾸어질 String
*/
String.prototype.replaceAll = function(searchStr, replacement) {
return this.split(searchStr).join(replacement);
}

var protoTypeTestStr = "TEST : Sample TEST text";
var protoTypeTestRtnStr = protoTypeTestStr.replaceAll("TEST", "Test");
console.log("protoTypeTestRtnStr : ", protoTypeTestRtnStr);

- 결과값

protoTypeTestRtnStr :  Test : Sample Test text


2) 정규식을 활용

 - 변경하려는 값과 같은 것만(g 값을 사용)

var regexTestStr = "TEST : Sample TEST text";
var regexTestRtnStr = regexTestStr.replace(new RegExp("TEST", "g"), "Test");
console.log("regexTestRtnStr : ", regexTestRtnStr);

- 대소문자 구분 없이 처리(gi 값 사용)

var regexTestTipStr = "test : Sample test text";
var regexTestTipRtnStr = regexTestTipStr.replace(new RegExp("TEST", "gi"), "Test");
console.log("regexTestTipRtnStr : ", regexTestTipRtnStr);



3. 실제 사용하는 방법

1) String prototype으로 추가

/**
* String prototype replaceAll 추가
* - 정규식으로 replaceAll 구현
* - ignoreCasetrue이면 대소문자 구분없이 변경한다.
*
* @param searchStr : 바꾸려는 String
* @param replacement : 바꾸어질 String
* @param ignoreCase(boolean) : 대소문자 구분여부
*/
String.prototype.rexReplaceAll = function(searchStr, replacement, ignoreCase) {
return this.replace(new RegExp(searchStr, ignoreCase ? "gi" : "g"), replacement);
}


2) 실행

 - 소스

var regexProtoTestStr = "test : Sample test text";
var regexProtoTestRtnStr = regexProtoTestStr.rexReplaceAll("TEST", "Test", true);
console.log("regexProtoTestRtnStr : ", regexProtoTestRtnStr);

- 결과

regexProtoTestRtnStr :  Test : Sample Test text



4. 전체소스

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>JAVASCRIPT replaceAll 구현하기</title>
</head>
<body>
<script>
/* 자바스크립트 기본 replace 테스트 */
var oriReplaceTestStr = "TEST : Sample TEST text";
var oriReplaceRtnStr = oriReplaceTestStr.replace("TEST","Test"); // TEST라는 텍스트를 Test으로 변경
console.log("oriReplaceRtnStr : ", oriReplaceRtnStr);

/**
* String prototype replaceAll 추가
* - searchStr을 구분자로 분리(split)한 다음, replacement라는 연결자로 연결(join)하는 형태
*
* @param searchStr : 바꾸려는 String
* @param replacement : 바꾸어질 String
*/
String.prototype.replaceAll = function(searchStr, replacement) {
return this.split(searchStr).join(replacement);
}

var protoTypeTestStr = "TEST : Sample TEST text";
var protoTypeTestRtnStr = protoTypeTestStr.replaceAll("TEST", "Test");
console.log("protoTypeTestRtnStr : ", protoTypeTestRtnStr);

var regexTestStr = "TEST : Sample TEST text";
var regexTestRtnStr = regexTestStr.replace(new RegExp("TEST", "g"), "Test");
console.log("regexTestRtnStr : ", regexTestRtnStr);

/** TIP : 대소문자 구분없이 처리 **/
var regexTestTipStr = "test : Sample test text";
var regexTestTipRtnStr = regexTestTipStr.replace(new RegExp("TEST", "gi"), "Test");
console.log("regexTestTipRtnStr : ", regexTestTipRtnStr);

/**
* String prototype replaceAll 추가
* - 정규식으로 replaceAll 구현
* - ignoreCasetrue이면 대소문자 구분없이 변경한다.
*
* @param searchStr : 바꾸려는 String
* @param replacement : 바꾸어질 String
* @param ignoreCase(boolean) : 대소문자 구분여부
*/
String.prototype.rexReplaceAll = function(searchStr, replacement, ignoreCase) {
return this.replace(new RegExp(searchStr, ignoreCase ? "gi" : "g"), replacement);
}

var regexProtoTestStr = "test : Sample test text";
var regexProtoTestRtnStr = regexProtoTestStr.rexReplaceAll("TEST", "Test", true);
console.log("regexProtoTestRtnStr : ", regexProtoTestRtnStr);
</script>
</body>
</html>


5. TIP

1) 정규식 추가

 - m을 추가하면 여러줄에 대해서도 처리가 가능하다.

+ Recent posts