[Spring] Log masking 처리
민감한 개인 정보(이메일, 주민번호, 계좌번호 등)는 로그에서 마스킹 처리 해야 하는 경우가 있다.
로그 설정에서 손쉽게 마스킹 처리를 할 수 있다.
Logback
-
MaskingPatternLayout
: 마스킹을 위한 레이아웃 클래스- logback.xml의 마스킹 패턴을 읽고 이를 로그 메시지에 적용
-
PatternLayout
상속
public class MaskingPatternLayout extends PatternLayout
{
private Pattern multilinePattern;
private List<String> maskPatterns = new ArrayList<>();
public void addMaskPattern(String maskPattern) {
maskPatterns.add(maskPattern);
multilinePattern = Pattern.compile( maskPatterns.stream()
.collect(Collectors.joining("|")), Pattern.MULTILINE);
}
@Override
public String doLayout(ILoggingEvent event) {
return maskMessage(super.doLayout(event));
}
private String maskMessage(String message) {
//When masking is disabled in a environment
if (multilinePattern == null) {
return message;
}
StringBuilder sb = new StringBuilder(message);
Matcher matcher = multilinePattern.matcher(sb);
while (matcher.find()) {
IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> {
if (matcher.group(group) != null) {
IntStream.range(matcher.start(group),
matcher.end(group)).forEach(i -> sb.setCharAt(i, '*'));
}
});
}
return sb.toString();
}
}
- logback.xml
<configuration>
<appender name="mask" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.mypro.common.log.MaskingPatternLayout">
<maskPattern>(01\d|02|0[3-9]\d|05\d\d)(-?)(\d{3,4})(-?)(\d{4})</maskPattern> <!-- Phone pattern -->
<maskPattern>(\w+@\w+\.\w+)</maskPattern> <!-- Email pattern -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %replace([%X{CorrelationId}] ){'^\[\] $',''}%highlight(%-5level) %green(%logger{36}) - %msg%n</pattern>
</layout>
</encoder>
</appender>
</configuration>
Logstash
- 스테이징, 프로덕션 환경에서는 모니터링을 위해 로그를 데이터 파이프라인으로 보내야 되는데 이를 위해 사용된다
- xml 설정만으로 가능
<configuration>
<appender name="logstash" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
<!-- Phone pattern -->
<valueMask>
<value>(01\d|02|0[3-9]\d|05\d\d)(-?)(\d{3,4})(-?)(\d{4})</value>
<mask>$1****$5</mask>
</valueMask>
<!-- Email pattern -->
<valueMask>
<value>(\w)\w*@(\w*)\.(\w*)</value>
<mask>$1****@$2.$3</mask>
</valueMask>
</jsonGeneratorDecorator>
</encoder>
</appender>
</configuration>