귀하의 질문에 답하십시오 : URL 경로를 임의로 추측하기 어려운 부분으로 구성 할 수 있습니다 (예 : https://hostname/fileshare/Zak/myVideos/295223cb464d4e4794b93a09a1c730fd
). UUID는 128 비트 데이터이며 거의 표준입니다.
또 다른 방법은 쿼리 문자열에 체크섬 토큰을 추가하는 것입니다 : 토큰이 URL 경로에서 생성됩니다 https://hostname/fileshare/Zak/myVideos/lolcat.mp4?h=187515ZED
(아마도 심지어 쿼리 문자열) (exemple hmac256에 대한) 일부 보안 알고리즘을하고있는 당신의 Controller
(또는 더 좋게는 Filter
) h 매개 변수가 실제로 해시 된 경로와 같은지 확인합니다.
편집 : 추가 설명 : 당신이 이미 파일 시스템 디렉토리를 기반으로 콘텐츠를 제공 할 수있는 컨트롤러를 가지고 (또는 적어도 가질 예정) 한 있으리라 믿고있어
. 이전 예에서 나는 좋아하는 것 같다고 가정했다. /Zak/myVideos/
. 스프링 컨트롤러는 파일 이름으로이 디렉토리의 파일을 쉽게 반환 할 수 있지만 파일 이름이 추측하기 쉬운 경우 (예 : video.mp4
) /Zak/myVideos/video1.mp4가 취약하다는 것을 알고 있습니다. 그래서 UUID를 사용하도록 제안했습니다.
UUIDS 사용 방법은 무엇입니까?
/Zak/myVideos에서 파일의 이름을 바꿀 수 있으면 임의의 UUID로 이름을 바꾸면 투명하게 작동합니다. 이것의 단점은 1) 파일 이름이 더 이상 의미가 없으며 2) 파일의 이름을 바꿀 수 없다는 것입니다.
또한 파일 이름과 UUID를 참조하는 DB 테이블을 가질 수 있으며 컨트롤러에 올바른 UUID에서 올바른 파일 이름을 검색하는 서비스를 호출하게 할 수 있습니다. 이것에 대한 단서는 당신이 DB를 가지고 약간의 코드를 작성해야하고 (DB를 쿼리하기 위해 API 호출 속도를 늦추는) 것이 필요하다는 것입니다.
그래서 토큰을 사용하는 것이 좋습니다. url은 여전히 파일에 대한 litteral 경로이지만 queryString에 추가 매개 변수 (토큰)가 필요합니다. servletRequestFilter는 파일을 제공하는 컨트롤러에 대한 액세스 권한을 부여하기 전에 토큰이 유효한지 여부 (간단한 해시 + 확인 알고리즘 사용)를 확인할 수 있습니다. 이렇게하면 파일의 이름을 바꾸거나 DB를 만들 필요가 없습니다.
리소스에 대한 경로에 임의의 UUID (128 비트 16 진수 문자열)를 넣으면 사람이 추측 할 수 없다고 가정 할 수 있습니다. –