diff --git a/src/main/java/com/eactive/apim/portal/common/internal/InternalApiTokenService.java b/src/main/java/com/eactive/apim/portal/common/internal/InternalApiTokenService.java index cd7f516..402f670 100644 --- a/src/main/java/com/eactive/apim/portal/common/internal/InternalApiTokenService.java +++ b/src/main/java/com/eactive/apim/portal/common/internal/InternalApiTokenService.java @@ -95,16 +95,15 @@ public class InternalApiTokenService { */ public boolean matches(String presented) { String expected = ensureToken(); - if (expected == null) { - log.error("내부 API 토큰({}/{})을 확보하지 못해 요청을 거부합니다.", PROP_GROUP, PROP_TOKEN); - return false; - } - if (isBlank(presented)) { - return false; - } - return MessageDigest.isEqual( - presented.trim().getBytes(StandardCharsets.UTF_8), - expected.getBytes(StandardCharsets.UTF_8)); + return tokenMatches(presented, expected); + } + + /** + * admin 등 토큰을 생성하면 안 되는 애플리케이션용 검증. + * 프로퍼티가 없으면 생성하지 않고 거부한다. + */ + public boolean matchesReadOnly(String presented) { + return tokenMatches(presented, findToken()); } /** 기동 시 1회 호출 — 헤더명/토큰 프로퍼티를 미리 만들어 둔다. (포탈 전용) */ @@ -138,6 +137,19 @@ public class InternalApiTokenService { } } + private boolean tokenMatches(String presented, String expected) { + if (expected == null) { + log.error("내부 API 토큰({}/{})을 확보하지 못해 요청을 거부합니다.", PROP_GROUP, PROP_TOKEN); + return false; + } + if (isBlank(presented)) { + return false; + } + return MessageDigest.isEqual( + presented.trim().getBytes(StandardCharsets.UTF_8), + expected.getBytes(StandardCharsets.UTF_8)); + } + /** JVM 당 1회만 생성되는 난수 토큰 (DB 에 값이 없을 때의 기본값). */ private String localToken() { String token = generatedToken.get();