목록DEV&OPS/Java (148)
삶 가운데 남긴 기록 AACII.TISTORY.COM
1. 이클립스 > Window > Preferences 2. Java > Code Style > Code Templates 에서 Comments 항목을 펼치면 여러가지 항목이 나오는데 그 중에서 Types: 클래스 상단에 적용되는 주석 Methods: 메서드에 적용되는 주석 위 항목들을 클릭하고 Edit 버튼을 눌러 자주 사용하는 2개만 수정해 봅시다. Types 예제 /** * @author : ${user} * @date : ${date} * @description : */ Methods 예제 /** * @author : ${user} * @date : ${id:date('YYYY-MM-dd')} * @description : * ${tags} */ 위처럼 Edit 한 후 apply를 눌러 적용합니다..
Bcrypt 사용 예 maven이나 gradle로 관련 라이브러리를 추가 후 아래와 같이 사용합니다. String pw = "pw1234!"; //실제 데이터베이스에 저장될 패스워드의 해시값 String hashed = BCrypt.hashpw(pw, BCrypt.gensalt()); //입력된 패스워드와 해시되어 저장된 패스워드를 비교 boolean isValid = BCrypt.checkpw(pw, hashed); salt 해시된 패스워드를 저장한 테이블인 Rainbow Table 을 이용한 해킹 공격을 막기 위하여 랜덤 생성한 salt값을 더한 뒤 다시한 번 해시 값을 얻어서 Rainbow Table 을 이용한 공격을 막습니다. Bcrypt 해시 값의 예 $2a$10$vI8aWBnW3fID.ZQ4/..
JAVA application Export runnable jar 자바 어플리케이션을 실행가능한 jar 파일로 만들 때 manifest 파일(MANIFEST.MF)에 메인 클래스를 지정해줘야 합니다. https://iloveaired.tistory.com/entry/Jar-manifest-%ED%8C%8C%EC%9D%BC-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0 Jar manifest 파일 등록하기 예) Manifest-Version: 1.0 Main-Class: XXXXX iloveaired.tistory.com https://m.blog.naver.com/eungsik80/220054805497 jar 파일 생성 시 MANIFEST.MF 작성 jar 파일 생성 시 MANIFE..
1. 인코딩(Encoding) 1.1. 파일 및 문자 인코딩은 UTF-8 (gerneral_ci)으로 통일한다. 2. 이름(Naming) 2.1. 변수명, 클래스명, 인터페이스명, 메서드명에는 영어와 숫자만 사용한다. public interface AutoClosable{ 2.2. 변수명, 클래스명, 인터페이스명, 메서드명 단어 합성시에는 낙타 등 표기법으로 한다. public interface RowMapper{ 2.3. 클래스명, 인터페이스명, 생성자명은 대문자로 시작한다. public class WatcherClass{ 2.4. 변수명과 메서드명은 소문자로 시작해야한다. public String setHtmlName(String mode){ 2.5. 상수명은 모두 대문자로 하고 단어를 합성할 때는 ..
java.util.concurrent.TimeUnit 패키지 TimeUnit은 멀티 Thread가 아닌 메서드에서 시간을 지연 시킬 때 사용합니다. 예제 import java.util.concurrent.TimeUnit; public class SimpleTest { public static void main(String[] args) { try { for (int i = 0; i < 3; i++) { TimeUnit.SECONDS.sleep(2); System.out.println("Sleep "+i+" sec"); } }catch(Exception e) { System.out.println(e); } } } 자세한 api 문서는 아래 참고 https://docs.oracle.com/javase/7/d..
서비스(비즈니스 로직) 서비스 레이어는 controller와 persistence 사이에서 비즈니스 로직을 수행하는 역할입니다. service 패키지를 만들어 아래 예제를 작성합니다. package ds.co.kr.todo.service; import org.springframework.stereotype.Service; @Service public class TodoService { public String testService() { return "Test Service"; } } @Service 어노테이션은 비즈니스 로직을 수행하는 컴포넌트이며 서비스 레이어임을 알려주는 어노테이션입니다. 스테레오 타입 어노테이션으로 내부에 @Component를 포함하고 있습니다. @RestController 에도 ..
REST 제약 조건 Client - Server 구조를 따릅니다. stateless 클라이언트가 서버에 요청을 보낼 때 이전 요청의 영향을 받지 않습니다. 그래서 요청을 보낼 때 로그인(인증) 정보를 항상 함께 보내야 합니다. http는 기본적으로 staeless 구조입니다. Cacheable 캐시가 가능한지 명시할 수 있어야 합니다. http는 헤더에 cache-control 에서 캐시 여부를 명시할 수 있습니다. Uniform Interface 리소스를 URI를 통한 인터페이스로 관리합니다. Layered System 인증서버, 캐싱 서버, 로드 밸런서 등 여러 레이어로 된 서버들을 거치지만 클라이언트는 서버 사이의 레이어의 존재 유무를 알지 못합니다. Code on demand 클라이언트는 서버에 ..
아키텍처 Request → Controller(프레젠테이션 레이어, DTO) → Service(비즈니스 레이어, Model) → Persistence(퍼시스턴스 레이어, Entity) → DB(데이터베이스 레이어) → Persistence(entity) → Service(model) → Controller (DTO)→ Response Model, Entity 비지니스 데이터를 담는 역할을 Model이라 부르고 데이터베이스의 테이블의 스키마를 표현하는 역할을 Entity라고 합니다. 아키텍처의 각 레이어 별로 부르는 이름이 다를 뿐, 이름은 신경 쓰실 필요는 없습니다. Lombok 어노테이션 @Builder 디자인 패턴 중에서 빌더 패턴으로 구현하여 객체를 생성해줍니다. 생성자로 생성하는 것과 차이가 있다..
Gradle 빌드 도구 빌드 도구는 컴파일, 라이브러리 다운로드, 패키징, 테스팅 등을 자동화 해주는 도구를 말합니다. 프로젝트가 커지면 라이브러리가 많아지므로 전체를 빌드하기에는 비효율 적이므로 빌드를 나눠서 해야합니다. gradle은 이런 컴파일, 빌드, 유닛 테스트 등을 코드(그루비 언어)로 관리해줍니다. build.gradle plugins { id 'org.springframework.boot' version '2.6.12-SNAPSHOT' id 'io.spring.dependency-management' version '1.0.13.RELEASE' id 'java' } group = 'ds.co.kr' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1..
스프링 부트(Spring boot) 기존 스프링 프레임워크는 세팅이 매우 복잡하기 때문에 세팅을 자동으로 해주는 스프링 부트가 등장했습니다. 스프링 부트 덕분에 Stand-alone 어플리케이션을 쉽게 구동가능해졌습니다. 기존에는 자바 웹 어플리케이션을 WAR 파일로 압축해서 WAS에 배포했었고 다수의 WAR 파일을 동시 구동할 수 있어서 stand-alone이 아닙니다. 스프링 부트는 내장된 임베디드 WAS(tomcat, jetty 등)로 구동하게 됩니다. IDE 는 전자정부프레임워크 4.0 이상이나 STS 에서 스프링 부트를 지원합니다. DispatcherServlet 기존 웹 어플리케이션 개발은 HttpServlet을 상속하는 클래스를 만들고 doGet()이나 doPost()메서드를 구현하고 Htt..
Download of Code Without Integrity Check 무결성 체크를 하지 않은 코드 다운로드 원격으로부터 소스 코드 또는 실행파일을 무결성 검사 없이 다운받고 실행하게되면 host 서버의 변조, DNS spoofing또는 전송시 코드 변조를 통해 악의적인 코드를 실행할 수 있습니다. 방어 방법 자동 업데이트 처럼 다운로드 될 코드를 제공할 때는 코드에 대한 암호화된 시그니처를 사용하고 클라이언트가 시그니처를 검증하도록 합니다. 안전하지 않은 코드의 예 URL[] classURLs= new URL[]{new URL("file:subdir/")}; URLClassLoader loader = new URLClassLoader(classURLs); Class loadedClass = Clas..
Unsafe Reflection 안전하지 않은 리플렉션 동적 클래스 loading시 외부의 입력을 사용할 경우, 공격자가 외부 입력을 변조하여 의도하지 않은 클래스가 로딩되도록 할 수 있습니다. 방어 방법 외부의 입력을 직접 클래스 이름으로 사용하지 말고, white 리스트에서 클래스 이름을 선택하도록 합니다. 안전하지 않은 코드의 예 String type = props.getProperty("type"); Worker w; try{ Class workClass = Class.forName(type + "Worker"); w = (Worker) workClass.newInstance(); w.doAction(); }catch (ClassNotFoundException e) { …… } 5라인 에서 외부입..
Process Control 프로세스 제어 정의 신뢰되지 않는 소스나 환경에서 라이브러리를 적재하거나 명령을 실행하면 악의적인 코드가 실행될 수 있습니다. 방어 방법 라이브러리를 적재할 때 절대 경로를 사용합니다. 안전하지 않은 코드의 예 public void loadLibrary() throws Exception{ //외부 라이브러리 호출 시 절대 경로를 사용하지 않고 있습니다. Runtime.getRuntime().loadLibrary("libraryName"); } 안전한 코드의 예 public void loadLibrary() throws Exception{ //외부 라이브러리 호출 시 절대 경로를 지정합니다. Runtime.getRuntime().loadLibrary("/usr/lib/libra..
Eval Injection 동적으로 생성되어 수행되는 명령어 주입 정의 외부 입력이 동적으로 스크립트나 명령어 생성에 사용될 경우 의도하지 않은 명령어가 외부부터 주입되어 문제를 일으킬 수 있습니다. 방어 방법 외부의 입력이 eval()함수의 인자로 사용될 경우 위험 문자를 제거합니다. ESAPI for javascript 등 보안 API를 이용하여 외부에서 입력되는 값을 검증한 후 사용합니다. 안전하지 않은 코드의 예 외부 입력 evalParam이 eval()함수의 인자로 사용되고 있습니다. 안전한 코드의 예
Improper Neutralization of Script-Related HTML Tags in a Web Page 크로스 사이트 스크립트 공격 취약점 정의 외부에서 입력되는 스크립트 문자열이 웹 페이지 생성에 사용되면 생성된 웹페이지를 열람하는 사용자에게 피해를 입힐 수 있습니다. 방어 방법 jsp의 document.write() 같은 DOM 객체 출력을 수행하는 메소드의 인자 값으로 외부 입력을 사용하면 위험한 문자를 제거해야 합니다. 보안성이 검증된 API를 사용하여 위험 문자열을 제거하십시오. 안전하지 않은 코드의 예 document.write("name:"+); 외부 입력을 그대로 이용하고 있습니다. 안전한 코드의 예