개요
작성한 코드에 대해 보안성 검토를 받았는데 파일에 대해 TOCTOU 문제가 발생할 수 있다는 코멘트를 받았습니다.
제가 작성한 코드는 아래와 같았습니다.
if (file.exists()) {
file.delete();
}
원인
싱글 쓰레드일 경우에는 위 코드가 문제없겠지만 멀티 쓰레드 환경에서는 위 코드에 대해 race condition이 발생할 수 있습니다.
TOCTOU는 Time Of Check to Time Of Use의 줄임말인데 이 말은 즉슨 file이 존재하는지 확인한 시점에는 파일이 존재할 수 있으나 파일을 삭제하려고 하는 시점에 이미 해당 파일이 삭제되었을 수 있다는 뜻입니다.
정리를 하자면 멀티 쓰레드 환경에서 동시에 해당 파일에 접근하여 나중에 들어온 요청이 먼저 들어온 요청보다 먼저 작업을 수행할 경우 문제가 발생할 수 있습니다.
해결 방법
위 문제를 방지하기 위해서는 아래와 같이 thread-safe 하게 코드를 작성해야 합니다.
if (file.exists()) {
deleteFile(file);
}
private synchronized void deleteFile(File file) {
file.delete();
}
위와 같은 코딩 기법에 대해서는 milkye님이 아래와 같이 잘 정리해주셨습니다.
1. 동기화 구문을 통해 한번에 하나의 쓰레드만 공유자원에 접근 가능하도록 처리
2. 꼭 동기화가 필요한 부분만 감싸 성능에 최대한 영향을 끼치지 않도록 처리
참고
https://milkye.tistory.com/359
반응형
'[DEV] 기록' 카테고리의 다른 글
[Git] Invocation failed Unexpected end of file from server (0) | 2022.08.03 |
---|---|
[C++ STL] map vs unordered_map (0) | 2022.07.29 |
[MySQL + MariaDB] 날짜를 기준으로 파티셔닝 (0) | 2022.07.21 |
[MySQL] 서버 timezone 한국으로 변경하기 (0) | 2022.07.21 |
[Git] 브랜치명 변경하는 방법 (0) | 2022.07.18 |