1. conf파일 기본 형태

#데이터를 가지고옴.

input {

}


#데이터를 가공함.

filter {

}


#데이터를 출력함.

output {

}


2. mysql에서 데이터 가져와서 파일로 생성해보기.

 1) mysql-connector를 직접 다운받아, path를 지정해줘야함.

(1) connector 다운로드

wget 'https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.tar.gz'


 - 'https://dev.mysql.com/downloads/connector/j/' 링크를 통해서 직접 다운로드 받을 수도 있다.


(2) 압축풀기

tar -xvf ./mysql-connector-java-5.1.46.tar.gz


(3) 파일이동

  - 필요한 파일만 원하는 디렉토리로 이동

mv ./mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar ./lib/mysql-connector-java-5.1.46.jar


(4) 불필요한 파일 삭제

rm -rf ./mysql-connector-java-5.1.46*


 * pwd 명령어를 사용하면 편하게 path를 가져올수있음.


 2) mysql로 input 사용

(1) plugin 확인

bin/logstash-plugin list jdbc


 - 없을 경우 install 해야한다.

bin/logstash-plugin install logstash-input-jdbc


(2) input conf

input {

  jdbc {

    jdbc_driver_library => "~/lib/mysql-connector-java-5.1.46.jar"

    jdbc_driver_class => "com.mysql.jdbc.Driver"

    jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name?useUnicode=true&characterEncoding=utf8&useSSL=false"

    jdbc_user => "user_name"

    jdbc_password => "user_password"

    statement => "SELECT 1 FROM DUAL"

  }

}


 - 옵션설명(https://www.elastic.co/guide/en/logstash/6.2/plugins-inputs-jdbc.html)

옵션명 

기능 

비고 

 jdbc_driver_library

 mysql-connector 라이브러리 위치

 앞에서 다운받은 위치

 jdbc_driver_class

 드라이버 클래스

 Mysql : com.mysql.jdbc.Driver

 jdbc_connection_string Connect String 설정 
 jdbc_user

 계정명

 
 jdbc_password

 계정 비밀번호

 
 statement 

 조회하려는 쿼리

 SELECT 1 FROM DUAL


(3) 간단하게 확인하기 위해 json 형태로 출력하자

output {

  stdout { codec => json }

}


(4) 실행 확인

 - 문법확인도 함께 하려면 옵션에 -t 를 추가한다.

bin/logstash -f ~/sample.conf


 - 응답

[INFO ][logstash.inputs.jdbc     ] (0.041156s) SELECT 1 FROM DUAL

{"1":1,"@version":"1","@timestamp":"2018-03-22T07:44:43.471Z"}







1. Logstash란?

 - 입력(input), 필터(filter), 출력(output) 3단계로 구성되어 있고, 다양한 플러그인이 있어 여러 상황에서 사용하기 편함.

 - ex) 로그수집 등


2. Logstash 설치

 1) Centos 7기준

(1) java 설치 여부 확인

java -version


 - 아래와 같이 나오면 설치되어 있는 것이고, 아닐 경우 jdk 설치를 먼저 진행하세요.

java version "1.8.0_151"

Java(TM) SE Runtime Environment (build 1.8.0_151-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)


(2) Logstash 다운로드

 - wget으로 받아야하므로, wget 설치 필요

wget 'https://artifacts.elastic.co/downloads/logstash/logstash-6.2.0.tar.gz'


 - 압축풀기

tar -xvf ./logstash-6.2.0.tar.gz


 - 링크설정

ln -s logstash-6.2.0 logstash


 - 다운받은 tar.gz 파일 삭제

rm -rf ./logstash-6.2.0.tar.gz


- 확인

logstash -e ‘input { stdin { } } output { stdout {} }’


3. Logstash 설정

- aws ec2를 프리티어로 사용할 경우나, 메모리가 부족할 경우에만 설정하세요.

 1) JVM 메모리 설정

vi ~/logstash/config/jvm.options


 2) config 수정

-Xms128m

-Xmx128m



4. 플러그인 

 1) 플러그인 리스트 확인

bin/logstash-plugin list

bin/logstash-plugin list --group input 


 2) 플러그인 설치

bin/logstash-plugin install #{플러그인명}


 3) 플러그인 업데이트

bin/logstash-plugin update 

bin/logstash-plugin update #{플러그인명}


 4) 전체플러그인 목록

(1) INPUT : 바로가기

(2) FILTER : 바로가기

(3) OUTPUT : 바로가기



* 참고페이지

 - https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html

 - https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

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