티스토리 뷰

반응형

✏️ 작업 배경

CloudWatch 로그를 확인하던 중, OAuth 로그인 및 토큰 재발급 API 응답 body에 포함된 accessToken, refreshToken이 평문으로 남는 문제가 확인됐다. 기존 ControllerLogAspect는 컨트롤러 응답 객체 전체를 objectMapper.writeValueAsString(result)로 직렬화해 로그로 남기고 있었다. 이로 인해 인증 토큰이 CloudWatch에 그대로 저장될 수 있었다.

대상 API

  • POST /oauths/kakao
  • POST /oauths/v2/kakao
  • POST /oauths/apple
  • POST /oauths/v2/apple
  • POST /oauths/reissue/token

 

✏️ 문제점

  • 인증 토큰이 CloudWatch에 평문으로 저장
  • 로그 접근 권한이 있는 사람이 토큰을 확인할 수 있음
  • 토큰 유효 기간 내 악용 가능성 존재
  • 요청 DTO 일부 민감 필드도 마스킹 기준이 부족했음

 

✏️ 개선 방향

 

전체 로그 정책을 바꾸기보다, 우선 명확한 보안 문제인 OAuth 응답 토큰 노출 방지에 집중했다.

  • /oauths/** 응답 body는 로깅하지 않음
  • OAuth 응답 대신 [response-body-skipped] 문구만 남김
  • 요청 DTO의 민감 필드는 @LogMask로 마스킹
  • 테스트 코드를 추가해 OAuth 응답 body 제외 동작을 검증

 

✏️ 변경 내용

1. OAuth 응답 body 로깅 제외

ControllerLogAspect에서 URI가 /oauths/로 시작하는 경우 응답 body를 직렬화하지 않고 고정 문자열을 반환하도록 변경했다. 이를 통해 accessToken, refreshToken이 로그에 남지 않도록 처리했다.

result=[response-body-skipped]

2. 요청 민감정보 마스킹

로그인 요청에 포함될 수 있는 민감 필드에 @LogMask를 적용했다.

{
  "deviceType": "IOS",
  "providerId": "***",
  "email": "***"
}

3. 테스트 개선

ControllerLogAspectTest를 추가해 다음 내용을 검증했다.

  • /oauths/** 응답은 [response-body-skipped]로 기록되는지
  • 일반 API 응답은 기존처럼 기록되는지
  • @LogMask가 붙은 필드는 **로 마스킹되는지

리뷰 반영으로 테스트에서 리플렉션 호출을 제거하고, 테스트 대상 메서드를 package-private으로 변경해 직접 호출하도록 정리했다.

 

✏️ 운영 확인 결과

Prod CloudWatch 로그에서 다음과 같이 확인했다.

항목 결과
providerId, email 마스킹 처리됨 (***)
OAuth 응답 body 출력되지 않음
accessToken, refreshToken 평문 노출 없음

 

✏️ 이번 작업 범위에서 제외한 것

 

전체 로그 정책은 이번 PR에서 정리하지 않았다. 아래 내용은 별도 이슈로 다루는 것이 적절해 보였다

  • 어떤 API에서 request / response body를 남길지
  • 로그인 성공/실패 로그를 별도로 남길지
  • INFO, WARN, ERROR 로그 기준
  • 개인정보 포함 API의 로깅 기준
  • CloudWatch 보관 기간 및 검색 기준

 

✏️ 결론

이번 작업으로 OAuth 인증 응답에서 토큰이 CloudWatch에 평문으로 남는 문제를 해결했다. 현재 PR은 OAuth 토큰 로그 노출 방지에 집중해서 마무리하고, 전체 로그 정책은 추후 별도 작업으로 정리하는 것이 적절하다.

https://github.com/EAT-SSU/Server/pull/372

 

fix: 인증 응답 로그 마스킹 처리 by pooreumjung · Pull Request #372 · EAT-SSU/Server

#️⃣ Issue Number resolved fix: 로그에서 JWT 토큰 및 민감정보 노출 제거 #371 📝 요약(Summary) ControllerLogAspect의 응답 로깅에서 /oauths/** URI에 해당하는 경우 응답 body를 [response-body-skipped]로 대체하여 acc

github.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함