콘텐츠로 이동
Bluetape4k 문서1.11

Codec과 보안

최신 안정판 Bluetape4k 1.11.0 릴리스 기준

Codec을 바꾸면 같은 Redis key의 byte format이 바뀝니다. 성능 설정 하나를 바꾸는 일이 아니라 rolling deployment와 rollback에 영향을 주는 schema migration입니다. 같은 cache name을 공유하는 모든 producer와 consumer가 key·value Codec을 맞춰야 합니다.

목적1.11.0 선택주의할 점
일반 내부 객체RedissonCodecs.Fory지원하지 않는 값은 Kryo5 fallback을 사용할 수 있습니다.
휘발성 고처리량 cacheFastForyCodec, LZ4FastForyFastFory data를 기존 ForyCodec이 역방향으로 읽지 못합니다.
사람이 확인할 JSONJackson3Codectype envelope와 package allow-list를 관리합니다.
JSONBFastjson2Codecclass name을 load하기 전에 allow-list로 검증합니다.
큰 값 압축LZ4·Zstd·Snappy·GZip wrapperCPU 비용과 압축 해제 크기 제한을 함께 봅니다.

Jackson3CodecFastjson2CodecallowedPackagePrefixes가 없으면 모든 class name을 허용하고 fallback decode도 엽니다. 여러 tenant나 서비스가 Redis를 공유하면 접두사를 좁게 지정합니다.

val codec = Jackson3Codec(
allowedPackagePrefixes = setOf("com.acme.billing."),
)

allow-list가 있으면 JSON envelope가 아닌 binary payload의 fallback decode는 기본적으로 SecurityException으로 거부됩니다. trusted migration에서만 allowFallbackDecode = true를 일시적으로 사용하고 제거 날짜를 정합니다.

FastForyCodec은 FastFory decode가 실패하면 기존 Fory Codec으로 재시도할 수 있습니다. 따라서 기존 Fory data를 새 reader가 읽는 migration은 가능합니다. 반대로 기존 ForyCodec은 FastFory byte를 해석하지 못하므로 old/new application이 동시에 write하는 rolling deployment에는 맞지 않습니다.

안전한 전환은 새 reader가 old format을 읽는 기간을 먼저 배포하고, write format을 바꾼 뒤 old reader를 제거하는 순서입니다. rollback 가능성을 유지해야 한다면 새 format write를 늦춥니다.

GzipCodecmaxDecompressedSize를 받아 압축 폭탄과 비정상적으로 큰 Redis value를 막습니다.

val codec = GzipCodec(
innerCodec = RedissonCodecs.Fory,
maxDecompressedSize = 16 * 1024 * 1024,
)

정상 payload의 p99 크기를 기준으로 상한을 정하고 초과는 실패로 관찰합니다. 깨진 gzip payload도 빈 값으로 바꾸지 않고 decode exception을 전파합니다.

Benchmark를 선택 규칙으로 오해하지 않는다

섹션 제목: “Benchmark를 선택 규칙으로 오해하지 않는다”

모듈에 Codec benchmark가 있지만 결과는 payload, JVM, CPU와 library version에 따라 달라집니다. 숫자를 고정된 우열로 옮기지 말고 실제 domain object와 크기로 다시 측정합니다. wire compatibility와 보안 경계가 throughput보다 먼저입니다.