티스토리 뷰
✏️ 작업 배경
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
'Back-End > 잇슈' 카테고리의 다른 글
| [EAT-SSU / 잇슈] - CI/CD 개선 작업 정리 #1 (0) | 2026.07.05 |
|---|---|
| [EAT-SSU / 잇슈] - Grafana Cloud + Alloy로 모니터링 구축 (0) | 2026.06.30 |
| [EAT-SSU / 잇슈] Docker 배포 스크립트 개선 - 전체 컨테이너 삭제 방지 (0) | 2026.06.23 |
| [EAT-SSU / 잇슈] GitHub Actions 빌드 시간 줄이기 (0) | 2026.06.22 |
| [EAT-SSU / 잇슈] RDS 데이터 다른 AWS 계정으로 이전하기 (0) | 2026.05.03 |
- Total
- Today
- Yesterday
- 백준 풀이
- js
- 우선순위 큐
- 반복문
- c++ string
- 카운팅 정렬
- 자바스크립트
- html
- 유클리드 호제법
- 자료구조
- Do it!
- C++
- 유니온 파인드
- 투 포인터
- 이분 매칭
- 알고리즘
- CSS
- 에라토스테네스의 체
- HTML5
- 세그먼트 트리
- BFS
- 스택
- 자바
- 알고리즘 공부
- DFS
- 스프링 부트 crud 게시판 구현
- java
- C++ Stack
- DP
- 백준
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |