2017-05-10 1 views
0

저는 여러 가지 기술을 연구하여 멀티 플레이트 폼 응용 프로그램 용 API를 작성하고 있습니다. 이 응용 프로그램은 사용자가 인증없이 친구와 파일을 공유 할 수있는 가능성을 제공해야하지만 URL은 추측 할 수 없어야 파일이 비밀이 유지됩니다. Juste는 Google 사진에서 사진 기능을 공유하는 것을 좋아합니다.스프링 부트를 사용하여 비밀 URL 만들기

스프링 부트는 다중 플레이트 API를 만드는 가장 흥미로운 프레임 워크 중 하나입니다.하지만 비밀스럽고 틀린 URL을 만들 수 있는지 궁금합니다.

감사합니다.

+3

리소스에 대한 경로에 임의의 UUID (128 비트 16 진수 문자열)를 넣으면 사람이 추측 할 수 없다고 가정 할 수 있습니다. –

답변

1

귀하의 질문에 답하십시오 : 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를 만들 필요가 없습니다.

+0

Jeremy에게 감사드립니다.하지만 봄에 그것을 할 원시 방법이 있는지 궁금 해서요. 예를 들어, 인증 및 URL 보안을위한 스프링 보안과 같습니다. – Zak

+0

'java.util.UUID.randomUUID()'를 사용하여 임의의 UUID를 Java로 생성 할 수 있습니다. 그래서 제안했습니다. 파일이 서버에서 어떻게 끝날지 설명하지 않았으므로 URL 생성에 도움이 될 것 같지 않습니다. –

+0

토큰을 사용하면 지연 후 취소 할 가능성을 사용자에게 부여하는 것이 더 좋습니다. 시간 내 주셔서 감사합니다. Jeremy – Zak

관련 문제