server: servlet: context-path: / session: # 세션 타임아웃 10분 고정 # WebLogic 배포 시에는 weblogic.xml 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-.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