# 시작 검증기가 거절하는 문구 problems.add("a cursor signing key is required; unsigned cursors are client-editable"); # 그 검증기는 실제로 돈다 — 자동설정의 호출 지점: 127: validator.validate(properties); # 그 키 설정을 소비하는 main 코드 GraphQlPlatformActuatorEndpoint.java:62: properties.cursor().keyIds(), GraphQlPlatformStartupValidator.java:42: if (properties.production() && properties.cursor().keyIds().isEmpty()) { # 그중 액추에이터 엔드포인트를 만드는 main 코드: 0 # 서명 코덱과 키링 GraphQlCursorCodec 구현체 수: 1 그것을 만드는 main 코드: 0 # 서명될 커서가 지금 있는가 커넥션 조립기를 만드는 main 코드: 0 배포되는 스키마 전체 type Query { "Liveness token for the GraphQL transport — mirrors the web adapter's /healthcheck." _health: String! } # 그런데 릴리스 게이트가 읽는 매니페스트는 이미 승인 목록에 넣어 두었다 24- "REQUEST_CONTEXT", 25- "SECURITY", 26- "DATALOADER", 27: "SIGNED_CURSOR_CONNECTION", # 그 부재를 고정하는 테스트 assertThat(context) .as( "and nothing signs with it: production refuses to start without a key that " + "protects nothing, which is worse than not asking for one") .doesNotHaveBean(GraphQlCursorCodec.class); assertThat(context).doesNotHaveBean(GraphQlCursorKeyRing.class); }); # 그리고 요구는 남기라고 못 박는 네 번째 케이스 @DisplayName("the startup validator still demands the key it cannot make anyone use") void theValidatorStillDemandsTheUnusedKey() { GraphQlPlatformSettings production = GraphQlPlatformSettings.productionDefaults().withCursorKeyIds(Set.of()); assertThat(new GraphQlPlatformStartupValidator().problems(production)) .as( "kept, not removed: the demand is right and the missing half is the implementation. " + "When cursor signing reaches the request path, the two cases above invert and " + "this one stays exactly as it is.") .anySatisfy(problem -> assertThat(problem).contains("cursor signing key")); # 등급표가 두 능력에 매긴 등급 149:| cursor 서명 (`pagination/`) | `modelled` | `HmacGraphQlCursorC 150:| mutation 멱등성 (`mutation/`) | `modelled` | `GraphQlMutation 168:- **cursor 서명이 요청 경로에 없다 (GQL-INT-003).** `bac