59c379b22c
- RSA-OAEP + AES-GCM 기반 비밀번호 전송 암호화 모듈 구현 - 클라이언트 공개키 발급 및 복호화 처리 로직 개발 - 암호화 설정 속성 및 요청별/세션별/서버별 키 보관소 구성
468 lines
15 KiB
YAML
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
|