
개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 기본 암호화 기능을 추가할 수 있는 LIB

package studio.thinkground.aroundhub.config;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* GitHub : https://github.com/ulisesbocchio/jasypt-spring-boot
*/
@Configuration
public class JasyptConfig {
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
String password = "around_hub_studio";
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password); // 암호화할 때 사용하는 키
config.setAlgorithm("PBEWithMD5AndDES"); // 암호화 알고리즘
config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
config.setPoolSize("1"); // 인스턴스 pool
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
config.setStringOutputType("base64"); //인코딩 방식
encryptor.setConfig(config);
return encryptor;
}
}
jasypt: # 프로퍼티 암호화 설정
encryptor:
bean: jasyptStringEncryptor
package studio.thinkground.aroundhub.config;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class JasyptTest {
@Test
void encryptTest(){
String id = "ddd";
String password = "ddd";
System.out.println(jasyptEncoding(id));
System.out.println(jasyptEncoding(password));
}
public String jasyptEncoding(String value) {
String key = "around_hub_studio";
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword(key);
return pbeEnc.encrypt(value);
}
}
Spring Boot에서는 서버의 환경에 맞추어 설정할 수 있는 Profile 기능 제공
특정 환경에서 실행할 Bean을 설정하기 위해 사용
// dev 환경에서만 실행하겠다
@Profile("dev")
@Configuration
public class DevConfiguration implements EnvConfiguration{
...
연산자를 통한 표현도 가능하다
// dev 환경에서 실행하지 않겠다
@Profile("!dev")
@Configuration
public class DevConfiguration implements EnvConfiguration{
...
@Profile과 같은 곳에서 사용되는 환경의 선언은 대체로 JVM 시스템 변수로 전달
-Dspring.profiles.activate=dev
애플리케이션이 가동되는 환경에 따라 application.properties 별도 구분 관리 가능
파일 이름의 형식은 application-[profile].properties로 지정
2.4버전 이후부터는 동일한 application.properties 파일에서 Profile 별 속성을 구분하여 지정할 수 있음
캐시는 비교적 저장공간이 적고, 비용이 비쌈 but 빠른 I/O
일반적으로 아래 상황에 사용
Spring Boot에서의 캐시는 대부분 JSR-107을 따름
JSR : Java Specification Request, Java 플랫폼에 대한 규격을 제안하거나 기술한 것
그 중 JSR-107은 JCACHE (Java Temporary Caching API)에 관한 내용
JSR-107을 따르는 Cache를 사용하면 구현체 캐시 종류에 관계없이 추상화 지원
해당 서버에서만 사용하는 Cache, 외부 서버와의 트랜잭션 비용x, 속도 빠름
분산서버 구조에서 캐시를 공유하기 어려움
여러 서버에서 접근할 수 있는 캐시 서버를 구축하여 사용
네트워크를 통해 데이터를 가져오는 트랜잭션 비용 존재, 상대적으로 느림
별도의 서버로 운영, 서버 간 데이터 공유에 용이
Remote Dictionary Server
Key-Value 구조의 데이터를 저장하고 관리하기 위한 오픈소스 비관계형 데이터 관리 시스템
DispatcherServlet과 Controller 사이에서 Request를 가로채는 역할 수행
기존의 로직을 수정하지 않고 비즈니스 로직 전 후에서 특정 기능을 수행할 수 있음
이를 구현하기 위해 HandlerInterceptor 사용
Controller로 요청이 가기 전에 수행할 코드를 작성하는 메소드
return 값이 true일 경우 Controller로 요청을 전달하고 false일 경우 전달x
Object Handler 요청을 전달할 Controller 객체가 담겨 있음
컨트롤러의 로직이 수행된 이후 View가 렌더링 되기 전에 수행할 코드 작성
View가 렌더링 된 후에 실행되는 메소드
WAS가 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 웹 애플리케이션으로 전달
HTTP Protocol의 Req 정보를 서블릿으로 전달하기 위해 사용하는 객체
Header, Parameter, Cookie, URL, URI 등의 정보를 가짐
Body의 값을 읽기 위한 메소드를 가짐
요청에 대한 응답값을 담기 위한 객체
Content-Type이나 응답 코드, 메시지를 가짐
Java 5부터 추가된 기능으로, 소스코드에 추가적인 정보를 제공하는 메타데이터 기능 수행
Annotation은 Class, Method, 변수, 인자 등에 추가할 수 있음
Meta Data이기 때문에 비즈니스 로직에는 영향x, 실행 흐름 변경이 가능
Java 코드에 직접적으로 적용되는 어노테이션
@Override, @Deprecated, @SuppressWarnings
다른 Annotation에 적용되기 위한 Annotation
해당 Annotation의 정보를 어느 범위까지 유지할 것인지 설정
해당 Annotatiobn이 사용될 수 있는 위치를 설정
Java Doc 생성 시 Document에 포함되도록 하는 설정
해당 어노테이션을 하위 클래스에 적용
Java 8 버전부터 지원하며, 연속적으로 Annoation을 선언하는 것을 허용