Files
eapim-portal/src/main/resources/application.yml
T
Rinjae 59c379b22c 비밀번호 전송 암호화 기능 추가:
- RSA-OAEP + AES-GCM 기반 비밀번호 전송 암호화 모듈 구현
- 클라이언트 공개키 발급 및 복호화 처리 로직 개발
- 암호화 설정 속성 및 요청별/세션별/서버별 키 보관소 구성
2026-09-01 15:06:30 +09:00

468 lines
15 KiB
YAML

server:
servlet:
context-path: /
session:
# 세션 타임아웃 10분 고정
# WebLogic 배포 시에는 weblogic.xml <timeout-secs>600 이 동일 값을 적용한다.
# CSRF 토큰은 세션에 저장(HttpSessionCsrfTokenRepository)되므로 수명도 이 값과 동일하다.
timeout: 10m
cookie:
name: JSESSIONID_PORTAL
encoding:
charset: UTF-8
port: '39130'
error:
include-message: never
include-stacktrace: never
include-binding-errors: never
include-exception: false
whitelabel:
enabled: false
path: /error
# 리버스프록시(OHS) 전달 헤더(X-Forwarded-*)를 요청에 반영하는 전략.
# native = 내장 Tomcat RemoteIpValve 위임 → WAR(WebLogic) 배포에서는 동작하지 않는다.
# framework = Spring ForwardedHeaderFilter(서블릿 필터) → 배포 방식과 무관하게 동작한다.
# 기본값 native: 로컬 개발은 gradle bootRun(내장 Tomcat)으로 기동하므로 컨테이너 기본 처리에 맡긴다.
# RemoteIpValve 는 internalProxies(사설/loopback 대역) 에서 온 요청의 헤더만 신뢰하므로 로컬에서 안전하다.
# 프록시 뒤에 놓이는 WAR 배포 환경(dev/stage/prod)만 각 프로파일에서 framework 로 올린다.
# ※ framework 로 올리는 환경은 OHS 에서 반드시 아래를 수행해야 한다(신뢰 프록시 목록이 없어 헤더를 무조건 신뢰).
# RequestHeader unset X-Forwarded-For / -Proto / -Host / -Port / Forwarded (클라이언트 위조분 제거)
# RequestHeader set X-Forwarded-Proto "https" / X-Forwarded-Port "1443" (mod_wl_ohs 는 미전송)
forward-headers-strategy: native
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
min-response-size: 1024
spring:
config:
import:
- classpath:menu.yml
- classpath:roles.yml
profiles:
# dev/local_rinjaemac 단독 기동 시에도 playwright 전용 빈(test-cleanup 내부 API 등)이 뜨도록
# group 으로 자동 합류. (주의: spring.profiles.include 는 profile-specific 문서에서 금지 -
# application-{profile}.yml 의 on-profile 게이트 안에 두면 InvalidConfigDataPropertyException.
# 반드시 이 base 문서에 정의)
group:
dev: playwright
local_rinjaemac: playwright
data:
web:
pageable:
default-page-size: '10'
jpa:
open-in-view: false
hibernate:
ddl-auto: none
web:
resources:
cache:
period: 0 # 캐시 비활성화 (개발환경)
cachecontrol:
max-age: 0
must-revalidate: true
no-cache: true
# 정적자원 콘텐츠 해시 버전닝(/css/main.css -> /css/main-<hash>.css)은
# @EnableWebMvc 로 WebMvcAutoConfiguration 이 비활성화되어 spring.web.resources.chain
# 설정으로는 적용되지 않는다. 실제 버전닝은 PortalConfigWebDispatcherServlet 가
# 아래 app.resource-versioning.enabled 토글을 읽어 직접 수행한다.
# JTA/Atomikos 제거됨. EMS·AGW 각각 로컬 트랜잭션(JpaTransactionManager) 사용 - PortalConfigTransaction 참고
thymeleaf:
prefix: 'classpath:/templates/views/'
suffix: .html
mode: HTML
encoding: UTF-8
cache: false
main:
allow-bean-definition-overriding: true
# 정적자원 해시 버전닝 토글 (prod 제외 전 프로파일에 적용).
# false 로 변경 시 /css/main.css 가 해시 없이 그대로 서빙되어 sourceMap 디버깅 가능.
# prod 는 PortalConfigWebDispatcherServlet 에서 항상 ON 으로 고정되어 이 값을 무시함.
app:
resource-versioning:
enabled: false
# 정적자원 서버측 캐싱(ResourceChain 캐시) 토글 (prod 제외 전 프로파일에 적용).
# false 면 sass/JS 변경이 서버 재시작 없이 즉시 반영됨(매 요청 재해석).
# prod 는 PortalConfigWebDispatcherServlet 에서 항상 ON 으로 고정되어 이 값을 무시함.
resource-caching:
enabled: false
# 정적자원 서빙 루트. 기본은 classpath(빌드 산출물).
# local_rinjaemac 프로파일은 file: 로 소스 트리를 직접 바라보도록 오버라이드한다.
web-resources:
static-base: 'classpath:/static/'
security:
basic:
enabled: false
# ※ Actuator / Spring Boot Admin 설정은 이 파일에 두지 않는다.
# application-local*.yml 에만 두고, 해당 파일과 관련 라이브러리는 war/bootWar 산출물에서
# 제외된다(build.gradle 의 localOnly configuration + rootSpec.exclude 참고).
# WebLogic 배포본(dev/stage/prod)에는 actuator 자체가 존재하지 않는다.
sample-code-path: classpath:/templates/sample_code
ems:
datasource:
jndi-name: jdbc/dsOBP_EMS
schema: EMSAPP
driver-class-name: oracle.jdbc.OracleDriver
hibernate-dialect: org.hibernate.dialect.Oracle12cDialect
hibernate-physical-naming-strategy: com.eactive.apim.portal.common.entity.CustomPhysicalNamingStrategy
entity-package: com.eactive.apim.portal
gateway:
datasource:
jndi-name: jdbc/dsOBP_AGW
schema: AGWAPP
driver-class-name: oracle.jdbc.OracleDriver
hibernate-dialect: org.hibernate.dialect.Oracle12cDialect
hibernate-physical-naming-strategy: com.eactive.apim.portal.common.entity.CustomPhysicalNamingStrategy
entity-package: com.eactive.eai.data.entity.onl,com.eactive.apim.gateway.data.statistics.entity
portal:
file:
max-size: 10MB
allowed-extensions: pdf,doc,docx,xls,xlsx,ppt,pptx,hwp,gif,jpg,jpeg,png
logging:
log-path: /logs/prod/eapim
# 내부 사용자(운영자) 판별 설정
# 로그인 계정 이메일의 호스트가 아래 도메인이면 내부 사용자로 분류한다.
# "@" 접두사 유무·대소문자 무관
internal-user:
email-domains:
- djbank.com
- unit-test.com
auth-ttl: 300
auth:
resend_limit_seconds: 30
user-approval: true
password-expiration-days: 90
security:
# 비밀번호 전송암호화(RSA-OAEP + AES-GCM). 개발자도구 Network 탭 평문 노출 대응.
# 로컬/개발 서버는 HTTP(비 secure context)라 브라우저 crypto.subtle 을 못 쓰므로 기본은 꺼둔다.
# 켜져 있어도 브라우저가 지원하지 못하면 화면이 평문으로 폴백한다.
password-encrypt:
enabled: false
# REQUEST(폼당 1회용) | SESSION(세션당) | SERVER(서버 고정 + TTL 로테이션)
key-scope: REQUEST
key-ttl-seconds: 300
# true 면 평문 비밀번호 파라미터를 거부한다. JS 비활성 사용자가 로그인하지 못하므로 안정화 후에만 켠다.
strict: false
rsa-key-size: 2048
pages:
- path-pattern: /dashboard/daily_usage
method: GET
view-name: "apps/mypage/dailyApiUsage :: matrix"
bean: dailyApiUsageHandler
role: ROLE_DASHBOARD
- path-pattern: /apis/apikey/new
method: GET
view-name: apps/apis/mainApiKeyNew
role: ROLE_API_KEY_REQUEST
- path-pattern: /apis/apikey/prod
method: GET
view-name: apps/apis/mainApiKeyProd
role: ROLE_API_KEY_REQUEST
- path-pattern: /apis/common
method: GET
view-name: apps/apis/mainApiCommon
bean: apiHandler
- path-pattern: /apis/KAPAP004U3
method: GET
view-name: apps/apis/KAPAP004U3
bean: apiHandler
- path-pattern: /apis/KAPAP004U4
method: GET
view-name: apps/apis/KAPAP004U4
bean: apiHandler
- path-pattern: /apis/KAPAP004U5
method: GET
view-name: apps/apis/KAPAP004U5
bean: apiHandler
- path-pattern: /apis/KAPAP004U6
method: GET
view-name: apps/apis/KAPAP004U6
bean: apiHandler
- path-pattern: /apis/KAPAP004U7
method: GET
view-name: apps/apis/KAPAP004U7
bean: apiHandler
- path-pattern: /apis/KAPAP004U8
method: GET
view-name: apps/apis/KAPAP004U8
bean: apiHandler
- path-pattern: /apis/KAPAP004U9
method: GET
view-name: apps/apis/KAPAP004U9
bean: apiHandler
- path-pattern: /apis/KAPAP004U10
method: GET
view-name: apps/apis/KAPAP004U10
bean: apiHandler
- path-pattern: /login
method: GET
view-name: apps/login/login
bean: LoginHandler
- path-pattern: /guide
method: GET
view-name: apps/main/guide
- path-pattern: /intro
method: GET
view-name: apps/main/intro
- path-pattern: /service/intro
method: GET
view-name: apps/service/intro
- path-pattern: /service/guide
method: GET
view-name: apps/service/guide
- path-pattern: /service/oauth2-guide
method: GET
view-name: apps/service/oauth2-guide
- path-pattern: /service/webhook-dev-guide
method: GET
view-name: apps/service/webhook-dev-guide
- path-pattern: /dashboard
method: GET
view-name: apps/mypage/dashboard
bean: dashboardHandler
role: ROLE_DASHBOARD
- path-pattern: /apis/token-spec
method: GET
view-name: apps/apis/static/tokenApiSpec
bean: apiHandler
# portal_security 는 roles.yml (portal-roles) 로 이동
page:
home:
name: "Home"
path: "/"
children:
login:
name: 로그인
path: "/login"
children:
dormant_account:
name: "장기미사용 제한 해제"
path: "/dormant_account"
find_id:
name: 아이디 찾기
path: "/account_recovery?tab=findId"
reset_password:
name: 비밀번호 초기화
path: "/account_recovery?tab=resetPassword"
signup:
name: 회원가입
path: "/signup"
children:
user:
name: "개인회원가입"
path: "/signup/portalUser"
corp:
name: "법인회원가입"
path: "/signup/portalOrg"
verification_email:
name: "이메일 인증"
path: "/signup/verification-email"
decision:
name: "법인회원 초대"
path: "/signup/decision_process"
agreements:
name: 약관
path: "#"
children:
terms:
name: "이용약관"
path: "/agreements/terms"
about:
name: 안내
path: "#"
children:
intro:
name: "API Portal 소개"
path: "/intro"
guide:
name: "이용안내"
path: "/guide"
service:
name: 서비스 소개
path: "#"
children:
intro:
name: "API 포탈 소개"
path: "/service/intro"
guide:
name: "회원가입 안내"
path: "/service/guide"
oauth2_guide:
name: "OAuth2 개발가이드"
path: "/service/oauth2-guide"
webhook_dev_guide:
name: "웹훅 개발가이드"
path: "/service/webhook-dev-guide"
apis:
name: "API"
path: "#"
children:
apis:
name: "API 목록"
path: "/apis"
api_detail:
name: "API 상세보기"
path: "/apis/detail"
api_testbed:
name: "테스트베드"
path: "/apis/detail/testbed"
apistatus:
name: "API Status"
path: "/apistatus"
children:
issues:
name: "전체 이슈 이력"
path: "/apistatus/issues"
community:
name: 고객지원
path: "#"
children:
notice:
name: 공지사항
path: "/portalnotice"
notice_detail:
name: 공지사항
path: "/portalnotice/detail"
faq_list:
name: FAQ
path: "/faq_list"
faq_detail:
name: FAQ
path: "/faq_view"
inquiry:
name: "Q&A"
path: "/inquiry"
inquiry_detail:
name: "Q&A"
path: "/inquiry/detail"
inquiry_new:
name: "Q&A"
path: "/inquiry/new"
inquiry_edit:
name: "Q&A"
path: "/inquiry/edit"
partnership:
name: "사업 제휴 신청"
path: "/partnership"
mypage:
name: 마이페이지
path: "#"
children:
mypage:
name: "내 정보 관리"
path: "/mypage"
verification_email:
name: "이메일 인증"
path: "/mypage/verification-email"
user_list:
name: "개발자 관리"
path: "/users"
user_detail:
name: "개발자 정보"
path: "/users/detail"
apikey:
name: "API 신청 관리"
path: "/clients"
app_request_detail:
name: "인증키 신청 상세"
path: "/clients/app_request_detail"
credential_detail:
name: "인증키 정보"
path: "/clients/credential_detail"
password_verify:
name: "비밀번호 변경"
path: "/password/verify"
password_change:
name: "비밀번호 변경"
path: "/password/change"
clients_register_step1:
name: "앱 생성 (기본 정보)"
path: "/clients/register/step1"
clients_register_step2:
name: "앱 생성 (API 선택)"
path: "/clients/register/step2"
clients_register_step3:
name: "앱 생성 요청 완료"
path: "/clients/register/step3"
clients_modify_step1:
name: "앱 수정 (기본 정보)"
path: "/clients/modify/step1"
clients_modify_step2:
name: "앱 수정 (API 선택)"
path: "/clients/modify/step2"
clients_modify_step3:
name: "앱 수정 요청 완료"
path: "/clients/modify/step3"
api_statistics:
name: "이용 통계"
path: "/statistics/api"
webhook:
name: "Webhook 관리"
path: "/webhook"
webhook_register_step1:
name: "Webhook 신청 (기본 정보)"
path: "/webhook/register/step1"
webhook_register_step2:
name: "Webhook 신청 (API 선택)"
path: "/webhook/register/step2"
webhook_register_step3:
name: "Webhook 신청 완료"
path: "/webhook/register/step3"
webhook_modify_step1:
name: "Webhook 수정 (기본 정보)"
path: "/webhook/modify/step1"
webhook_modify_step2:
name: "Webhook 수정 (API 선택)"
path: "/webhook/modify/step2"
webhook_modify_step3:
name: "Webhook 수정 완료"
path: "/webhook/modify/step3"
# 에디터 이미지 설정 (약관 이미지 표시용)
editor:
image:
base-url: /file/view