application 설정 설명 추가, 일부 옵션 수정(운영환경에서도 SSL 사용하지 않으므로 변경)

dev
박성영 3 months ago
parent f000019b4a
commit 0fa106c3d4

@ -37,12 +37,13 @@ import java.util.List;
/**
* DataSource Proxy
*
*
* datasource-proxy SQL
* MyBatis include, foreach
*
*
* Environment DataSource
*
* Multi DB
*
* @author XIT Framework
*/
@Configuration
@ -52,61 +53,104 @@ public class DataSourceProxyConfig {
private Environment environment;
/**
*
* Primary
* Environment HikariDataSource
*/
@Bean
public DataSource actualDataSource() {
return createHikariDataSource("spring.datasource");
}
/**
* Secondary ( )
* Multi DB DB
*
* :
* @Bean
* public DataSource actualSecondaryDataSource() {
* return createHikariDataSource("spring.datasource.secondary");
* }
*/
/**
* HikariDataSource
*
* @param prefix application.yml prefix
* @return HikariDataSource
*/
private HikariDataSource createHikariDataSource(String prefix) {
HikariDataSource dataSource = new HikariDataSource();
// application.yml에서 설정값 읽기
dataSource.setJdbcUrl(environment.getProperty("spring.datasource.url"));
dataSource.setUsername(environment.getProperty("spring.datasource.username"));
dataSource.setPassword(environment.getProperty("spring.datasource.password"));
dataSource.setDriverClassName(environment.getProperty("spring.datasource.driver-class-name"));
dataSource.setJdbcUrl(environment.getProperty(prefix + ".url"));
dataSource.setUsername(environment.getProperty(prefix + ".username"));
dataSource.setPassword(environment.getProperty(prefix + ".password"));
dataSource.setDriverClassName(environment.getProperty(prefix + ".driver-class-name"));
// HikariCP 설정
dataSource.setMaximumPoolSize(environment.getProperty("spring.datasource.hikari.maximum-pool-size", Integer.class, 10));
dataSource.setMinimumIdle(environment.getProperty("spring.datasource.hikari.minimum-idle", Integer.class, 5));
dataSource.setConnectionTimeout(environment.getProperty("spring.datasource.hikari.connection-timeout", Long.class, 30000L));
dataSource.setIdleTimeout(environment.getProperty("spring.datasource.hikari.idle-timeout", Long.class, 600000L));
dataSource.setMaxLifetime(environment.getProperty("spring.datasource.hikari.max-lifetime", Long.class, 1800000L));
dataSource.setValidationTimeout(environment.getProperty("spring.datasource.hikari.validation-timeout", Long.class, 60000L));
dataSource.setMaximumPoolSize(environment.getProperty(prefix + ".hikari.maximum-pool-size", Integer.class, 10));
dataSource.setMinimumIdle(environment.getProperty(prefix + ".hikari.minimum-idle", Integer.class, 5));
dataSource.setConnectionTimeout(environment.getProperty(prefix + ".hikari.connection-timeout", Long.class, 30000L));
dataSource.setIdleTimeout(environment.getProperty(prefix + ".hikari.idle-timeout", Long.class, 600000L));
dataSource.setMaxLifetime(environment.getProperty(prefix + ".hikari.max-lifetime", Long.class, 1800000L));
dataSource.setValidationTimeout(environment.getProperty(prefix + ".hikari.validation-timeout", Long.class, 60000L));
return dataSource;
}
/**
* (Primary)
* Primary
* actualDataSource SQL
*
*
* @param actualDataSource
* @return
*/
@Bean
@Primary
public DataSource dataSource(@Qualifier("actualDataSource") DataSource actualDataSource) {
return createProxyDataSource(actualDataSource, "PRIMARY-DB");
}
/**
* Secondary ( )
* Multi DB DB
*
* :
* @Bean
* public DataSource secondaryDataSource(@Qualifier("actualSecondaryDataSource") DataSource actualSecondaryDataSource) {
* return createProxyDataSource(actualSecondaryDataSource, "SECONDARY-DB");
* }
*/
/**
*
*
* @param actualDataSource
* @param dataSourceName ( )
* @return
*/
private DataSource createProxyDataSource(DataSource actualDataSource, String dataSourceName) {
// SLF4J 쿼리 로깅 리스너 생성
SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
// 로그 레벨 설정 (DEBUG 레벨로 출력)
loggingListener.setLogLevel(SLF4JLogLevel.DEBUG);
// 로거 이름 설정 (쿼리 로그 식별을 위함)
loggingListener.setLogger("go.kr.project.sql");
// 쿼리 로그 엔트리 생성자 설정
DefaultQueryLogEntryCreator logEntryCreator = new DefaultQueryLogEntryCreator();
logEntryCreator.setMultiline(true); // 멀티라인으로 보기 좋게 출력
loggingListener.setQueryLogEntryCreator(logEntryCreator);
// 커스텀 파라미터 바인딩 리스너 생성
CustomParameterBindingListener customListener = new CustomParameterBindingListener();
// 프록시 데이터소스 빌더를 사용하여 프록시 데이터소스 생성
return ProxyDataSourceBuilder
.create(actualDataSource)
.name("IBMS-NEW-DB") // 데이터소스 이름 설정
.name(dataSourceName) // 데이터소스 이름 설정
.listener(loggingListener) // 기본 로깅 리스너 추가
.listener(customListener) // 커스텀 파라미터 바인딩 리스너 추가
.asJson() // JSON 형태로 파라미터 바인딩된 쿼리 출력

@ -7,11 +7,6 @@ spring:
config:
activate:
on-profile: dev
devtools:
livereload:
enabled: true
restart:
enabled: true
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://211.119.124.117:53306/ibmsdb?characterEncoding=UTF-8&allowMultiQueries=true
@ -70,9 +65,52 @@ server:
session:
timeout: 60m # 세션 타임아웃을 60분으로 증가
cookie:
# ==========================================
# http-only: JavaScript로 쿠키 접근 가능 여부
# ==========================================
# true: document.cookie로 접근 불가 → XSS(Cross-Site Scripting) 공격 방어 (권장)
# false: JavaScript로 쿠키 읽기/수정 가능 → XSS 공격에 취약
# 보안: 항상 true 권장 (개발/운영 환경 모두)
http-only: true
secure: true # 개발환경에서는 false, 운영환경에서는 true
# ==========================================
# secure: HTTPS 연결에서만 쿠키 전송 여부
# ==========================================
# true: HTTPS(https://)에서만 쿠키 전송 → 중간자 공격(MITM) 방어
# - HTTPS 구성 필수
# - HTTP(http://)로 접근 시 쿠키 전송 안됨 → 세션 유지 불가, 로그인 실패
# false: HTTP/HTTPS 모두 쿠키 전송 가능
# - 개발 환경에서 HTTP 사용 가능
# - IP 주소(192.168.x.x)로 접근 가능
# 개발환경: false, 운영환경: true (HTTPS 인증서 적용 후)
secure: false
# ==========================================
# same-site: 크로스 사이트 요청 시 쿠키 전송 제어
# ==========================================
# strict: 같은 사이트에서만 쿠키 전송 (가장 안전하지만 불편)
# - example.com → example.com (O)
# - other.com → example.com (X)
# lax: 일부 크로스 사이트 GET 요청 허용 (권장, 보안과 사용성 균형)
# - 같은 사이트 모든 요청 (O)
# - 외부 링크 클릭(GET) (O)
# - 외부 폼 제출(POST) (X)
# none: 모든 크로스 사이트 요청 허용 (secure: true 필수)
# - 모든 외부 사이트 요청 허용
# 보안: CSRF(Cross-Site Request Forgery) 공격 방어
same-site: lax
# ==========================================
# tracking-modes: 세션 추적 방식
# ==========================================
# cookie: 쿠키로만 세션 추적 (권장, 안전)
# - 세션 ID가 쿠키에만 저장됨
# url: URL에 세션 ID 포함 (비권장, 보안 위험)
# - 예: http://example.com/page;jsessionid=ABC123
# - 세션 ID가 URL에 노출되어 로그, 히스토리에 남음
# - 세션 하이재킹 위험 증가
# ssl: SSL 세션 ID 사용
# 보안: cookie만 사용 권장 (URL 노출 방지)
tracking-modes: cookie
#logback

@ -63,6 +63,10 @@ spring:
#hikari.connection-test-query 는 JDBC 4.0 이상을 사용하면 설정하지 않는 것을 권장. (공식문서)
#connection-test-query: select 1
auto-commit: false
# secondary:
# url: jdbc:mariadb://localhost:3306/secondary_db
# username: user2
# password: pass2
# Server configuration
server:
@ -70,9 +74,52 @@ server:
session:
timeout: 60m # 세션 타임아웃을 60분으로 증가
cookie:
# ==========================================
# http-only: JavaScript로 쿠키 접근 가능 여부
# ==========================================
# true: document.cookie로 접근 불가 → XSS(Cross-Site Scripting) 공격 방어 (권장)
# false: JavaScript로 쿠키 읽기/수정 가능 → XSS 공격에 취약
# 보안: 항상 true 권장 (개발/운영 환경 모두)
http-only: true
secure: false # 개발환경에서는 false, 운영환경에서는 true
# ==========================================
# secure: HTTPS 연결에서만 쿠키 전송 여부
# ==========================================
# true: HTTPS(https://)에서만 쿠키 전송 → 중간자 공격(MITM) 방어
# - HTTPS 구성 필수
# - HTTP(http://)로 접근 시 쿠키 전송 안됨 → 세션 유지 불가, 로그인 실패
# false: HTTP/HTTPS 모두 쿠키 전송 가능
# - 개발 환경에서 HTTP 사용 가능
# - IP 주소(192.168.x.x)로 접근 가능
# 개발환경: false, 운영환경: true (HTTPS 인증서 적용 후)
secure: false
# ==========================================
# same-site: 크로스 사이트 요청 시 쿠키 전송 제어
# ==========================================
# strict: 같은 사이트에서만 쿠키 전송 (가장 안전하지만 불편)
# - example.com → example.com (O)
# - other.com → example.com (X)
# lax: 일부 크로스 사이트 GET 요청 허용 (권장, 보안과 사용성 균형)
# - 같은 사이트 모든 요청 (O)
# - 외부 링크 클릭(GET) (O)
# - 외부 폼 제출(POST) (X)
# none: 모든 크로스 사이트 요청 허용 (secure: true 필수)
# - 모든 외부 사이트 요청 허용
# 보안: CSRF(Cross-Site Request Forgery) 공격 방어
same-site: lax
# ==========================================
# tracking-modes: 세션 추적 방식
# ==========================================
# cookie: 쿠키로만 세션 추적 (권장, 안전)
# - 세션 ID가 쿠키에만 저장됨
# url: URL에 세션 ID 포함 (비권장, 보안 위험)
# - 예: http://example.com/page;jsessionid=ABC123
# - 세션 ID가 URL에 노출되어 로그, 히스토리에 남음
# - 세션 하이재킹 위험 증가
# ssl: SSL 세션 ID 사용
# 보안: cookie만 사용 권장 (URL 노출 방지)
tracking-modes: cookie
#logback

@ -7,11 +7,6 @@ spring:
config:
activate:
on-profile: prd
devtools:
livereload:
enabled: true
restart:
enabled: true
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://211.119.124.117:53306/ibmsdb?characterEncoding=UTF-8&allowMultiQueries=true
@ -70,9 +65,52 @@ server:
session:
timeout: 60m # 세션 타임아웃을 60분으로 증가
cookie:
# ==========================================
# http-only: JavaScript로 쿠키 접근 가능 여부
# ==========================================
# true: document.cookie로 접근 불가 → XSS(Cross-Site Scripting) 공격 방어 (권장)
# false: JavaScript로 쿠키 읽기/수정 가능 → XSS 공격에 취약
# 보안: 항상 true 권장 (개발/운영 환경 모두)
http-only: true
secure: true # 개발환경에서는 false, 운영환경에서는 true
# ==========================================
# secure: HTTPS 연결에서만 쿠키 전송 여부
# ==========================================
# true: HTTPS(https://)에서만 쿠키 전송 → 중간자 공격(MITM) 방어
# - HTTPS 구성 필수
# - HTTP(http://)로 접근 시 쿠키 전송 안됨 → 세션 유지 불가, 로그인 실패
# false: HTTP/HTTPS 모두 쿠키 전송 가능
# - 개발 환경에서 HTTP 사용 가능
# - IP 주소(192.168.x.x)로 접근 가능
# 개발환경: false, 운영환경: true (HTTPS 인증서 적용 후)
secure: false
# ==========================================
# same-site: 크로스 사이트 요청 시 쿠키 전송 제어
# ==========================================
# strict: 같은 사이트에서만 쿠키 전송 (가장 안전하지만 불편)
# - example.com → example.com (O)
# - other.com → example.com (X)
# lax: 일부 크로스 사이트 GET 요청 허용 (권장, 보안과 사용성 균형)
# - 같은 사이트 모든 요청 (O)
# - 외부 링크 클릭(GET) (O)
# - 외부 폼 제출(POST) (X)
# none: 모든 크로스 사이트 요청 허용 (secure: true 필수)
# - 모든 외부 사이트 요청 허용
# 보안: CSRF(Cross-Site Request Forgery) 공격 방어
same-site: lax
# ==========================================
# tracking-modes: 세션 추적 방식
# ==========================================
# cookie: 쿠키로만 세션 추적 (권장, 안전)
# - 세션 ID가 쿠키에만 저장됨
# url: URL에 세션 ID 포함 (비권장, 보안 위험)
# - 예: http://example.com/page;jsessionid=ABC123
# - 세션 ID가 URL에 노출되어 로그, 히스토리에 남음
# - 세션 하이재킹 위험 증가
# ssl: SSL 세션 ID 사용
# 보안: cookie만 사용 권장 (URL 노출 방지)
tracking-modes: cookie
#logback

Loading…
Cancel
Save