API 요청/응답 로깅 개선#245
Conversation
📊 코드 커버리지 리포트
|
| log.info("[API RESPONSE] {} {} -> {} body={}", request.getMethod(), uri, response.getStatus(), | ||
| responseBody(response)); |
There was a problem hiding this comment.
INFO 로 항상 남기면 토큰/이메일만 가려도 사용자 데이터가 그대로 운영 로그에 쌓입니다. 이 서비스 응답에는 채팅 본문, AI 답변, 링크 메모, 요약 내용 같은 사용자 콘텐츠가 포함되는데, 현재 마스킹은 email/password/token 계열만 처리해서 본문 유출 문제가 그대로 남습니다. 이번 PR의 목적이 “민감정보 제거 + 운영 로그 노이즈 축소”라면 응답 본문은 DEBUG 로 내리거나, 정말 필요한 일부 endpoint만 allowlist 로 남기는 쪽이 좋을 것 같습니다.
There was a problem hiding this comment.
응답 본문을 DEBUG로 내리려던 것을 실수로 요청 본문에 적용했었네요.
짚어주신 덕분에 응답 본문 로그 레벨을 DEBUG로 수정 반영했습니다.
There was a problem hiding this comment.
응답 본문을 DEBUG로 내린 건 확인했는데, 요청 본문이 아직 INFO로 남아 있어서 원래 코멘트가 완전히 해소되진 않았습니다. 현재도 채팅 질문, 링크 메모, 요약 요청 payload 같은 사용자 콘텐츠가 운영 로그에 적재될 수 있어보입니다.
There was a problem hiding this comment.
요청 본문 로그를 응답 본문과 동일하게 DEBUG로 내렸습니다. 이제 헤더·요청/응답 본문이 모두 DEBUG에서만 남고, INFO에는 메타 정보(메서드·경로·상태·응답시간·IP)만 남깁니다. 사용자 입력 콘텐츠가 운영 기본 로그에 적재되지 않습니다. 짚어주셔서 감사합니다.
4c061c2 to
fc597ae
Compare
|
@Goder-0 |
| } | ||
|
|
||
| long tookMs = (System.nanoTime() - startNs) / 1_000_000; | ||
| String query = request.getQueryString() != null ? "?" + request.getQueryString() : ""; |
There was a problem hiding this comment.
query string 도 그대로 로그에 남기면 민감값 유출 경로가 하나 더 생깁니다. header/body 마스킹과 별개로 \?token=, ?code= 같은 값이 적재될 수 있으니, access log 에서는 query string 을 제거하거나 민감 키 마스킹이 필요해 보입니다. 제가 생각하기엔 token, code 등만 제외하면 될 것 같긴합니다.
There was a problem hiding this comment.
query string도 maskQueryString()으로 마스킹 처리했습니다. 확인해보니 민감 값이 query로 오는 경로는 OAuth 콜백의 code/state뿐이라(나머지는 헤더/쿠키 처리) 그 둘을 마스킹 대상으로 두었습니다.
fc597ae to
7b7fb0d
Compare
7b7fb0d to
81df37a
Compare
관련 이슈
PR 설명
배경
RequestLoggingFilter가 모든 요청의 헤더·바디를 INFO 로 통째 로깅하여authorization/cookie의 JWT 토큰, 로그인 요청의 비밀번호가 평문으로 남고 있었음.변경 사항
민감 정보 로깅 제거
method / uri / status / 소요시간 / ip / user-agent만 한 줄로 기록Authorization,Cookie,Set-Cookie등)는 값 전체 마스킹Set-Cookie)는 로깅하지 않아 토큰이 헤더로 새지 않음요청/응답 본문 로깅 (마스킹 적용)
email등)·JWT 패턴 마스킹 + 2000자 상한email/password/토큰류 필드 값 마스킹, 필드명과 무관하게eyJ...JWT 패턴은 통째로 마스킹ContentCachingResponseWrapper사용 시copyBodyToResponse()호출로 빈 응답 방지로그 노이즈 제거
RequestLoggingFilter에서 노이즈 경로(/actuator,/favicon.ico,/swagger,/v3/api-docs) 요청 로깅 제외GlobalExceptionHandler에서NoResourceFoundException(스캐너 404) ERROR → DEBUG 강등JwtTokenProvider에서 익명 요청에 대한Token not found로그 삭제