You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
관리자가 화면에서 붙이는 방문 추적 스크립트 체계 추가 — nonce CSP·출처 추출·차단 기록·같은 오리진 Momento 프록시 (v0.9.53): 워크벤치에 방문 추적 스니펫을 넣을 방법이 없었고 SPA shell 에는 CSP 자체가 없었음. 새 internal/tracking 패키지가 설정을 읽어 provider 스니펫을 요청별 nonce 로 렌더링하고(모든 <script> 에 부착), 스니펫에서 http(s) 출처를 추출해 정책에 넣으며, 브라우저가 막은 출처를 100개 고리 버퍼에 기록하고 허용 목록에 추가할 수 있게 함. 설정은 기존 admin settings 레지스트리에 tracking.* 13개(카테고리 tracking, 전부 기본 꺼짐, 8KB·provider·URL·placement·allowed_hosts 검증)로 얹어 런타임 스냅샷과 멀티 파드 폴링에 그대로 편승. 워크벤치 shell(index.html) 응답에만 script-src 'self'(+nonce·provider 출처·report-uri, style-src 'unsafe-inline' 은 React 인라인 스타일 때문에 허용) 정책을 달고 비화면 경로는 default-src 'none' 으로 좁혔으며 zero modtime 으로 304 를 막아 캐시된 본문과 새 nonce 가 어긋나지 않게 함. 레거시 콘솔(/admin)은 인라인 핸들러·style 때문에 CSP 없이 tracking.include_admin 일 때만 스니펫을 삽입(가이드에 명시). Momento 를 첫 provider 로 두고 tracking.momento_proxy(기본 켜짐)면 /momento/* 를 httputil.ReverseProxy 로 수집기에 넘기며(쿠키·Authorization 제거, 추적 꺼지면 404) 스니펫에 data-endpoint="/momento" 를 줘 정책에 외부 출처가 등장하지 않음. 엔드포인트 POST /tracking/csp-report(무인증, 추적 꺼져 있으면 폐기)·GET /admin/tracking/status·GET|DELETE /admin/tracking/violations·POST /admin/tracking/violations/allow 를 추가하고 SPA 설정 화면에 "방문 추적" 탭(provider 별 필드, 현재 상태·미완료 사유·정책 출처, 차단된 출처 목록 + 허용/비우기)을 추가. internal/tracking 단위 테스트 11건과 proxy HTTP 회귀 테스트 6건(꺼짐 시 페이지 불변·엄격 정책·프록시 닫힘 / 프록시 nonce 주입·요청별 새 nonce·자격 증명 제거 / custom 스니펫 출처 반영·신고→목록→허용→정책 반영 / 설정 검증 400)을 추가했고 실제 SPA 를 임베드한 서버와 스텁 수집기·headless Chromium 으로 비콘 도착·CSP 콘솔 오류 없음·끄면 원복을 확인. docs/ADMIN_GUIDE.md 4.5절에 설정 방법과 CSP·nonce·차단 출처 설명을 추가하고 PDF 를 다시 생성. dataworks:v0.9.53 이미지를 dataworks-v0.9.53.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.53.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.53.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.53
사용자·관리자 가이드를 캡처 포함 완성본으로 보강하고 PDF 정본 추가 (v0.9.52): 두 가이드 모두 .md 만 있고 .pdf 가 없었으며 가이드 표준이 요구하는 절이 빠져 있었음. 사용자 가이드에 '처음 5분'(로그인→관제실→검토 센터→출시 게이트→승인 기록)·'자주 하는 작업'·'용어' 절을 넣고, '막혔을 때' 는 일반론 대신 실제로 돌아오는 문구를 싣도록 로그인 실패(invalid_credentials)와 상품 런타임 API 오류 코드 13종을 HTTP 상태·서버 메시지·조치 표로 정리했으며, 쓰이지 않던 캡처(통합 검색, 알림 센터, 모바일 메뉴, 상품 탭 5종)를 싣고 alt 텍스트를 PDF 그림 설명이 되도록 한 줄 설명으로 바꿨음. 관리자 가이드에는 구성 요소·포트·볼륨·최소 자원 표, cmd/dataworks 가 읽는 환경 변수 137개 전수 표(이름·기본값·필수·설명), 역할별 등급과 Scope 표, 운영 절(상태 점검 엔드포인트·로그 위치·pg_dump 백업과 복구·업그레이드와 롤백), 증상→확인→조치 형식의 장애 대응 표와 보안 절을 추가(로그·응답 문구는 코드에서 확인한 실제 값). 관리자 가이드 '계정과 권한' 절에 실을 화면이 없던 문제도 함께 해소해, 캡처 스펙이 건너뛰던 관리자 설정의 '역할 및 권한' 탭을 서버 기본 역할·스코프·설명을 그대로 옮긴 /admin/roles·/admin/users 데모 픽스처로 촬영하고(desktop·mobile 20-admin-roles.jpg) 기존 캡처도 모두 다시 찍었음. 정본이 갈라지지 않도록 GitHub Pages 용 user-guide.html·admin-guide.html 이 저장소의 .md/.pdf 를 정본으로 가리키게 하고 README 에 PDF 링크를 추가. dataworks:v0.9.52 이미지를 dataworks-v0.9.52.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.52.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.52.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.52
action center 의 엔타이틀먼트 활성 판정이 런타임 규칙과 어긋나던 문제 수정 (v0.9.51): GET /admin/dataworks/action-center 는 ent.Status != "active" || entitlementExpired(...) 로 상태 문자열을 대소문자·공백까지 그대로 비교했지만, 런타임 조회 게이트는 store.EntitlementActive(status 는 EqualFold+trim, expires_at 은 trim 후 파싱하고 해석 불가면 만료)를 쓴다. 그래서 쓰기 경로가 status 를 정규화하기(v0.9.50) 전에 저장된 "Active"·" active " 행은 고객 API 키가 POST /v1/data-products/{key}/query 에서 정상적으로 서빙받는데도 운영 화면에는 inactive_access 로 떠서 운영자가 멀쩡한 접근권을 회수하도록 유도했고, 같은 행이 만료 예고(entitlement_expiring) 루프에는 도달하지 못해 갱신 신호까지 잃었음(계약 쪽 contractScopeStatusActive 와 같은 유형의 판정 불일치). 판정을 같은 패키지의 런타임 래퍼 entitlementActive 에 위임해 두 경로가 하나의 규칙을 쓰게 하고, 호출부가 사라진 entitlementExpired 를 삭제(진짜로 닫힌 revoked 행은 종전대로 inactive_access 로 남음). HTTP 회귀 테스트(레거시 "Active"·" active " 행 + revoked 행 → inactive_access 는 revoked 하나뿐, 20일 뒤 만료되는 공백 포함 행이 expiring_access 로 잡힘)를 추가해 재발을 차단하고 docs/OPERATIONS.md 의 "만료 예정 계약·권한 확인" 절에 문서화. dataworks:v0.9.51 이미지를 dataworks-v0.9.51.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.51.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.51.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.51
API Entitlement 쓰기 경로의 status 허용값 검증 부재 수정 (v0.9.50): POST /admin/dataworks/products/{key}/entitlements 는 expires_at 형식만 검사하고 status 는 그대로 저장해, enabled·actve 같은 오타가 들어오면 store.EntitlementActive 가 active 만 인정하므로 발급 순간부터 고객 API 키가 POST /v1/data-products/{key}/query 에서 403 inactive_entitlement 를 받는데 admin 목록에는 정상 발급된 접근권으로 보였음(계약 쪽 invalid_contract_status 와 같은 유형의 fail-closed 오설정). 계약 쪽 contractScopeStatusKnown 과 대칭으로 entitlementStatusKnown 을 두고 active(기본)·draft·suspended·revoked 만 허용하며 그 외에는 400 invalid_entitlement_status 로 거부하고, 소문자·trim 정규화 후 빈 값은 active 로 채워 응답이 실제 저장 행과 일치하도록 정렬(감사용으로 남기는 revoked 행은 관례대로 계속 저장 가능). HTTP 회귀 테스트(오타 상태 거부·미저장, ACTIVE 정규화 저장, revoked 허용, 생략 시 기본값이 응답·저장 행 모두 active)와 entitlementStatusKnown 표 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 5절에 문서화. dataworks:v0.9.50 이미지를 dataworks-v0.9.50.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.50.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.50.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.50
action center 가 revoked·draft·suspended 계약도 만료 임박으로 영구 집계하던 문제 수정 (v0.9.49): GET /admin/dataworks/action-center 의 contract_expiring 루프는 계약(Contract Scope)의 valid_to 만 보고 scope.Status 를 보지 않아, 런타임이 절대 서빙하지 않는 계약(draft·suspended·revoked)까지 "renew, narrow, or retire" 항목으로 보고했음. 종료한 계약의 valid_to 는 시간이 갈수록 과거로 멀어지기만 하므로 이 항목은 절대 사라지지 않고, 이미 만료된 창이라 심각도까지 high 로 고정돼 운영 화면과 expiring_contracts 카운터가 의도적으로 닫은 계약으로 영구히 부풀고 정말 갱신이 필요한 활성 계약을 덮었음(바로 아래 엔타이틀먼트 루프는 이미 ent.Status != "active" 를 걸러냄). 런타임의 활성 판정과 어긋나지 않도록 contractScopeCanServe 안에 있던 상태 검사를 contractScopeStatusActive 로 분리해 두 곳이 같은 규칙을 쓰게 했고, 이미 만료된 활성 계약은 종전대로 high 로 남겨 운영자가 원하는 신호를 유지(창 기준 필터가 아니라 상태 기준 필터만 추가). HTTP 회귀 테스트(90일 전 만료된 revoked·draft·suspended 3건 + 10일 뒤 만료 active 1건 → expiring_contracts=1, 액션은 활성 계약 하나)와 contractScopeStatusActive 표 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 5절에 문서화. dataworks:v0.9.49 이미지를 dataworks-v0.9.49.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.49.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.49.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.49
Contract Scope 접근 창 순서와 미지원 status 검증 부재 수정 (v0.9.48): POST /admin/dataworks/products/{key}/contract-scopes 는 valid_from·valid_to 의 RFC3339 형식만 보고 두 값의 순서는 보지 않아 valid_from 이 valid_to 보다 뒤인 뒤집힌 창을 200 으로 저장했는데, 런타임 contractScopeActive 는 현재 시각이 창 안에 있을 때만 참이므로 그렇게 저장된 계약은 존재하는 내내 모든 조회를 403 contract_scope_inactive 로 막았음. status 도 store 가 빈 값만 active 로 채울 뿐 허용값 검증이 없어 actve·enabled 같은 오타가 그대로 저장돼 계약이 즉시 죽었고, 두 경우 모두 admin 목록에는 정상적인 고객 계약으로 보였음(같은 핸들러가 이미 형식·rate_limit·allowed_fields·masking_policy 는 거부함). 뒤집힌 창은 400 invalid_access_window, 미지원 상태는 400 invalid_contract_status(허용: active·draft·suspended·revoked)로 거부하고 status 를 소문자·trim 정규화한 뒤 빈 값은 active 로 채워 응답이 실제 저장 행과 일치하도록 정렬. HTTP 회귀 테스트(뒤집힌 창 거부·미저장, 오타 상태 거부·미저장, 정규화 저장, 생략 시 기본값)와 contractScopeStatusKnown 표 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 5절에 문서화. dataworks:v0.9.48 이미지를 dataworks-v0.9.48.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.48.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.48.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.48
런타임이 실제로 수행하지 않는 마스킹 문구가 민감 상품 Publish Gate 를 통과시키던 문제 수정 (v0.9.47): applyMasking 이 구현한 정책은 redact·hash 뿐이고 그 외 값은 원본을 그대로 돌려주는데, POST /admin/dataworks/products/{key}/contract-scopes 는 masking_policy 를 검증 없이 저장했고 민감 상품 Publish Gate 는 비어 있지 않고 none 이 아니면 마스킹 구성으로 집계해, "개인 단위 원천값 제외" 같은 서술형 문구가 게시를 통과시키면서 조회 응답은 원본 값을 그대로 내보냈음. 같은 판독기는 반대 방향으로도 fail-open 이었는데, 마스킹은 계약별로 적용되는데 계약이 여럿일 때 그중 하나만 마스킹하면 상품 전체가 통과해 나머지 고객은 게시 후에도 원본 값을 받았음. 쓰기 경로에서 none(빈 값 포함)·redact·hash 만 허용하고(400 invalid_masking_policy, 소문자·trim 정규화) 게이트는 "아직 조회를 처리할 수 있는 계약이 모두" 런타임이 강제하는 정책을 가질 때만 참이 되게 정렬. revoked 상태나 이미 닫힌 창(파싱 불가 valid_to 포함)은 다시는 조회를 처리할 수 없으므로 제외해 옛 계약이 영구히 게시를 막지 않게 했고, 아직 시작되지 않은 창은 나중에 서빙하므로 포함한다(contractScopeCanServe 로 분리하고 contractScopeActive 가 이를 재사용). HTTP 회귀 테스트 3건(서술형 거부·정규화 저장, 레거시 행의 게이트 판정, 계약 둘 중 하나만 마스킹 시 차단 + 종료·미래 계약 처리)과 정책 분류·contractScopeCanServe 표 테스트, 허용 목록과 applyMasking 동기화 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 5절에 문서화. dataworks:v0.9.47 이미지를 dataworks-v0.9.47.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.47.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.47.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.47
한 API 키가 같은 상품에 엔타이틀먼트를 여러 개 가질 때 죽은 계약을 가리키는 행만 평가하던 문제 수정 (v0.9.46): dw_api_entitlements 는 id 단위로 저장돼 한 API 키가 같은 상품에 여러 행을 가질 수 있고 각 행이 자기 contract_key 를 가리키는데, POST /v1/data-products/{key}/query 는 store.FindAPIEntitlement 가 고른 한 행만 평가했음. 그래서 우선순위 1순위 행이 이미 종료된 계약(Contract Scope)을 가리키고 다른 활성 엔타이틀먼트가 살아 있는 계약을 가리키면, 실제로 유효한 접근권이 있는데도 403 contract_scope_inactive 로 막혔음. 후보 전체를 활성 우선·최신 우선으로 돌려주는 store.ListAPIEntitlementCandidates 를 추가하고(FindAPIEntitlement 는 그 첫 원소로 재구현), 런타임이 후보를 훑어 "엔타이틀먼트 활성 + scope 가 조회 허용 + 계약이 이 상품 것이고 active·유효기간 안 + 민감 상품이면 purpose 존재" 를 모두 만족하는 첫 행을 쓰도록 정렬. 요청 본문에 좌우되는 allowed_fields 와 호출량을 소모하는 rate_limit 은 선택 기준에서 제외해 후보 순회가 분당 한도를 앞당겨 소진하지 않게 했고, 만족하는 후보가 없으면 종전대로 1순위 행으로 검사를 흘려보내 inactive_entitlement·contract_scope_missing·contract_scope_inactive·missing_contract_purpose 중 실제 원인이 그대로 응답되도록 유지. HTTP 회귀 테스트(활성 두 행 중 죽은 계약 쪽이 1순위여도 200 이고 살아 있는 계약 키로 처리, 계약이 전부 닫히면 여전히 403 contract_scope_inactive)와 store 후보 정렬 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 에 선택 규칙을 문서화. dataworks:v0.9.46 이미지를 dataworks-v0.9.46.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.46.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.46.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.46
API Entitlement 만료 예고 부재와 action center 만료 예정 창 하드코딩 수정 (v0.9.45): GET /admin/dataworks/action-center 는 계약(Contract Scope)에만 30일 고정 예고를 주고 API Entitlement 에는 예고가 전혀 없어, 고객 API 키는 expires_at 당일 그대로 죽고 화면에는 그 뒤에야 inactive_access 로 나타나 운영자가 갱신을 준비할 신호가 하나도 없었음. 활성·미만료 엔타이틀먼트가 창 안에 만료되면 expiring_access/entitlement_expiring 액션으로 보고하도록 추가하고, 분기 단위 갱신 주기를 위해 30일로 고정돼 있던 창을 ?expiring_within=13w|45d|72h 로 지정할 수 있게 해 응답이 적용된 창을 expiring_within 으로 되돌려 주도록 정렬. 해석 불가·비양수 값을 기본값으로 조용히 되돌리면 운영자가 물어본 창과 다른 답을 주게 되므로 400 invalid_expiring_within 으로 거부. 내장 admin UI 는 새 액션을 기존 "접근 만료" 탭에 합산·필터하고 두 접근 액션 모두에 만료일을 표시하며, workbench 검토 화면의 summary→action type 매핑이 5개뿐이라 나머지 카운터 버튼이 빈 목록을 보여주던 문제도 함께 해소. parseExpiryHorizon 표 테스트와 HTTP 회귀 테스트(기본 30일에서 20일 뒤 만료 감지·200일짜리 미감지, 13w 로 60일 계약까지 감지, 7d 로 미감지, 잘못된 파라미터 400)를 추가해 재발을 차단하고 docs/OPERATIONS.md 와 README 에 문서화. dataworks:v0.9.45 이미지를 dataworks-v0.9.45.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.45.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.45.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.45
데이터 상품 조회 응답 키가 계약 표기를 따르지 않던 문제 수정과 빈 allowed_fields 계약 저장 차단 (v0.9.44): POST /v1/data-products/{key}/query 의 contractResponseFields 는 요청 필드를 계약의 allowed_fields 와 대소문자 무시로 대조하면서도 응답 data 의 키는 클라이언트가 보낸 표기를 그대로 사용했음. 그런데 같은 상품의 BuildDynamicOpenAPIDocument 는 allowed_fields 를 그대로 응답 프로퍼티 이름이자 required 목록으로 선언하므로, 계약이 score 인데 소비자가 Score 로 요청하면 상품 자신의 OpenAPI 문서에 없는 키가 내려가고 required 로 선언된 키는 빠져 응답 스키마를 검증하는 소비자가 깨졌음. 매칭된 계약 표기를 응답 키로 돌려주도록 정렬. 같은 경로에서 POST /admin/dataworks/products/{key}/contract-scopes 가 allowed_fields 없이도 200 으로 계약을 저장하는 것을 확인했는데, 그런 계약은 런타임에서 모든 조회를 403(empty_contract_scope·forbidden_fields)으로 막으면서 admin 목록에는 활성 계약으로 보였음. 접근 창·마스킹 정책 검증과 같은 관례로 400 invalid_allowed_fields 거부와 trim·대소문자 무시 중복 제거 정규화를 쓰기 경로에 추가. 표기 정규화 단위 테스트, 런타임 HTTP 회귀 테스트(Score·RISK_BAND 요청 → score·risk_band 응답), admin 쓰기 회귀 테스트를 추가해 재발을 차단하고 docs/OPERATIONS.md 에 문서화. dataworks:v0.9.44 이미지를 dataworks-v0.9.44.tar.gz 단일 오프라인 GitHub Release asset으로 배포.
배포 파일
파일
설명
dataworks-v0.9.44.tar.gz
오프라인 적재 가능한 Data Works Docker 이미지 (linux/amd64)
빠른 시작
# 이미지 로드
gunzip -c dataworks-v0.9.44.tar.gz | docker load
# 실행
docker run -d --name dataworks --restart=always \
-p 8080:8080 \
-e POSTGRES_DSN='postgres://dataworks:change-me@postgres:5432/dataworks?sslmode=disable' \
-e BOOTSTRAP_ADMIN='admin@dataworks.local' \
-e BOOTSTRAP_ADMIN_PASSWORD='change-me' \
-e ENCRYPTION_KEY='replace-with-64-hex-characters' \
dataworks:v0.9.44