1. HTML 기본구조

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>

</body>
</html>


2. <html lang="en"> ??

 - HTML 이 어떤 언어로 작성되어 있는지를 알려주는 값이다.

 - ISO 639-1 Language Codes  : 링크

 - 번역하기 등의 옵션은 해당 lang값을 참고하여 동작함.



1. public static void main(String[] args){} ????

 - java로 처음 "Hello, World!"를 쓸 때 써본거.

 - java application의 시작점


2. 소스

 1) 전체보기

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void main(String[] args) {
System.out.print("Hello, World!");
}
}


 2) public

  (1) 접근 제어자(Access Modifier)

- defualt, private, protected, public

- private -> default -> protected -> public 순으로 보다 많은 접근이 가능하다.

  (2) 해당 값 변경 또는 제거 할 경우

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

private static void main(String... args) {
System.out.print("Hello, World!");
}
}

 - 찾지 못함.

오류: MainTest 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)

또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.


 3) static

  (1) 설명

- java가 처음 실행되면 클래스의 객체가 없기 때문에, 해당 메소드는 static(인스턴스를 생성하지 않고도 호출이 가능해짐)이어야 접근이 가능하다.


  (2) 해당 값 변경 또는 제거 할 경우

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public void main(String... args) {
System.out.print("Hello, World!");
}
}

 - 찾지 못함.

오류: MainTest 클래스에서 기본 메소드가 static이(가) 아닙니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)


 4) void 

  (1) 설명

- Method의 리턴 유형

- void는 아무것도 돌려주지 않겠다는 내용.

- Main Method의 실행이 끝나면 프로그램이 종료되기 때문에, 아무것도 돌려줄 필요가 없다.


  (2) return 0 추가


  (3) 중간에 종료하기

- 아래 "Hello, World! 2" 는 실행되지 않는다.

- 아래와 같이 작성할 경우, 대부분의 툴에서는 Dead Code라고 뜬다.



 5) main

  (1) java application 실행시 main 으로 실행한다는 약속된 값.

  (2) 변경시

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void mainTest(String... args) {
System.out.print("Hello, World!");
}
}

  - 찾지 못한다.

오류: MainTest 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)

또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.


 6) String[] args or String... args

  (1) command line arguments 

  (2) 예제

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void main(String... args) {
for (String arg : args) {
System.out.println("arg : " + arg);
}

}
}

 - 실행(intellij)


 - 실행 Command Line

javac MainTest.java

java MainTest 1 2 3


 - 결과



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

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. banner.txt??


 - 위 이미지를 이쁘게 꾸며보자!.

2. 변경할 파일

 1) src/main/resources/banner.txt 

 

  - banner.txt 내에 원하는 텍스트를 넣으면 된다.


 2) 파일 위치도 변경하기

  (1) 기본 설정(application.yml or application.propertioes)

banner.location=classpath:banner.txt # Banner file location.


- 원하는 경로로 변경하면 된다.


3. 이쁜 text 만들기

 1) https://devops.datenkollektiv.de/banner.txt/index.html 


 2) http://patorjk.com/software/taag/#p=display&f=Ogre&t=Memorynotfound.com




4. 결과

 - 위에서 만든 텍스트를 banner.txt 파일에 넣으면 아래와 같이 볼 수 있다.



5. 좀더 이쁘게

 1) 컬러도 적용 가능하다.

 2) 아래 링크를 들어가면 Spring version 등의 값들을 노출 시킬 수 있다.

- 링크

 3) 이미지를 넣을 수도 있다.

banner.image.location=classpath:banner.gif # Banner image file location (jpg/png can also be used).

banner.image.width= # Width of the banner image in chars (default 76)

banner.image.height= # Height of the banner image in chars (default based on image height)

banner.image.margin= # Left hand image margin in chars (default 2)

banner.image.invert= # If images should be inverted for dark terminal themes (default false)


 4) 이미지를 ancii 로 변경할 수 있다.

- 링크


1. 소스코드

server

{

 ....

 

  location / 

  {

    valid_referers none blocked server_names *.example.com;


    if ($invalid_referer) {

            return   403;

    }


    ....

  }


}


* 참고페이지

http://nginx.org/en/docs/http/ngx_http_referer_module.html

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


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

HSTS(HTTP Strict Transport Security) 개념과 설정  (0) 2018.03.08

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



+ Recent posts