그 방법의 핵심은 “일반 웹에서 파일을 숨기는 것”이 아니라, 아예 해당 객체를 `.onion` 주소 뒤의 오리진에만 두고, 일반 웹에서는 그 주소나 바이트 스트림을 노출하지 않는 구조입니다. `.onion` 서비스는 Tor 네트워크를 통해서만 접근되므로, 해당 객체를 그쪽 오리진에만 두면 사실상 Tor Browser 사용자에게만 표시되게 만들 수 있습니다 [1][2].
## 구조
가장 단순한 설계는 2계층입니다. 공개 사이트는 일반 도메인에서 HTML만 제공하고, 민감하거나 제한된 객체는 별도 onion service에서만 제공하는 방식입니다 [1][3]. Tor Project는 onion services가 Tor 네트워크를 통해서만 접근되는 서비스라고 설명하고 있고, `.onion` 주소는 일반 브라우저로는 열리지 않습니다 [1][2].
- Public origin: `example.com`
- Onion origin: `xxxxxxxx...xxxxxxxx.onion`
- Public origin에는 일반 콘텐츠만 둡니다.
- 제한 객체는 onion origin의 object storage 또는 파일 서버 뒤에 둡니다.
## 표시 방식
실무적으로는 “Tor Browser 여부를 완벽 탐지”하려 하기보다, onion 페이지에서만 객체 URL을 렌더링하는 방식이 더 안정적입니다. Tor Browser는 onion site 접속 시 주소창에 onion 연결 상태를 표시하고, 일반 사이트가 onion counterpart를 광고할 때는 `Onion-Location` 헤더를 사용할 수 있습니다 [1][4].
예시는 이런 흐름입니다.
1. `example.com` 접속자에게는 일반 페이지를 보여줍니다.
2. 서버가 `Onion-Location` 헤더로 onion 대응 주소를 광고합니다 [1][4].
3. 사용자가 Tor Browser라면 브라우저에서 `.onion available` 제안을 받고 onion 버전으로 이동할 수 있습니다 [1].
4. onion 버전 HTML 안에서만 `
`, `
5. clearnet 버전 HTML에는 그 객체 링크 자체를 넣지 않습니다.
즉, “Tor 사용자만 보게” 하려면 탐지보다 분리가 중요합니다. 객체 URL이 clearnet HTML, JS, CSS, API 응답 어디에도 나오지 않으면 일반 사용자에겐 노출되지 않습니다.
## 구현 예
공개 사이트에서 onion 대응 주소를 알리는 헤더는 아래처럼 넣을 수 있습니다. Tor Project는 `Onion-Location`을 통해 일반 웹사이트가 onion counterpart를 광고할 수 있다고 설명합니다 [1][4].
```http
```
공개 페이지:
```html
일반 페이지
제한 객체는 여기서 렌더링하지 않음
```
onion 페이지:
```html
Tor 전용 페이지

```
이 방식에서는 객체가 public CDN에 없고 onion 오리진에만 있으므로, 일반 브라우저는 해당 리소스를 직접 가져올 수 없습니다 [1][3][2].
## 운영 주의점
“User-Agent가 Tor Browser면 보여주기” 같은 방식은 약합니다. User-Agent는 위조 가능하고, 진짜 Tor 사용자가 아닌데도 흉내 낼 수 있으므로, 표시 제어를 브라우저 식별에 의존하면 안 됩니다. 대신 콘텐츠 자체를 onion service 뒤에 두고, onion에서만 HTML이 그 객체를 참조하게 해야 합니다 [1][3].
추가로 Tor Project는 인증된 onion service도 지원한다고 설명합니다. 즉, 더 제한하려면 단순히 “Tor Browser 사용자만”이 아니라, “Tor Browser + 인증 토큰 보유자만” 접근하는 형태로 한 단계 더 좁힐 수 있습니다 [1].
원하시면 다음 답변에서는 Nginx 기준으로 `example.com` + `.onion` 듀얼 오리진 구성 예시와, 객체 스토리지를 MinIO/S3 호환으로 붙이는 샘플 설정까지 적어드릴게요.






