오늘은 웹 브라우저의 시크릿 모드가 실제로 어떻게 동작하는지 알아보겠습니다.
BOB 2기에 진행했던 '시크릿 모드 파헤치기'를 보고 관심이 생겨 조사하게 되었습니다.
1. 시크릿 모드 소개
우리가 흔히 사용하는 웹 브라우저인 Chrome, Firefox, Safari 등은 "시크릿 모드(Incogito Mode), 프라이빗 브라우징(Private Browsing)" 기능을 제공합니다.
해당 기능은 이름 그대로 개인정보를 보호하기 위한 브라우징 모드이며 히스토리나 쿠키, 캐시 등을 기기에 저장하지 않는 것이 핵심 기능입니다.
하지만 많은 사람들이 해당 기능에 대한 오해를 갖고 있습니다.
1. "기록이 전혀 남지 않는다.", "익명으로 접속할 수 있다."
2. "광고 추적을 피할 수 있다."
3. "바이러스, 멀웨어로부터 보호해 준다."
해당 오해에 대한 사실에 대해 조사하여 정리하였습니다.
2. 주제 선택 이유
시크릿 모드를 즐겨 사용하는 동아리 인원이 시크릿 모드 사용하라고 했지만 저는 귀찮다는 이유로 사용하지 않았었습니다.
시크릿 모드를 사용하는 이유를 물어보면 머뭇거리며 대답을 하지 못했습니다.
Knights Frontier 미션을 통해 BOB에서 진행한 프로젝트를 보던 중 시크릿 모드 파헤치기를 발견하였고, 해당 기능에 대해 조사하여 어느 상황에 사용하는 것인지 알아보고자 선택하게 되었습니다.
3. 시크릿 모드 개념
시크릿 모드는 사용자의 활동 내역을 로컬 기기에 저장하지 않는 브라우저 기능입니다.
즉, 방문한 사이트 기록(History), 쿠키(Cookie), 캐시(Cache), 세션/로컬스토리지(Session/LocalStorage) 데이터들이 브라우저를 닫는 순간 자동으로 소멸됩니다.
시크릿 모드의 동작은 다음과 같습니다.
- 시크릿 모드는 일반 세션과 분리된 임시 저장소를 사용
- 그렇기에 일반 브라우저 세션과 쿠키, 캐시, 로그인 상태가 분리됨
- 시크릿 모드의 창을 모두 닫으면 메모리에 있던 임시 세션 데이터들이 모두 삭제됨
- 시크릿 모드 브라우저를 완전히 닫을 때마다 새로운 세션이 시작됨
하지만, 요청을 전송할 때는 일반 모드와 동일하게 IP, User-Agent, 브라우저 버전 등의 정보가 네트워크를 통해 전송됩니다.
따라서, 시크릿 모드의 기능은 기기 내부에 저장되는 데이터 저장하지 않는 것이지 서버, 네트워크의 기록을 없애는 기능은 아닙니다.
4. Flask를 통한 실습
Flask를 통해 간단한 서버를 만들어 일반 브라우저와 시크릿 모드 브라우저가 어떤 차이를 보이는지 확인해 봤습니다.
결과를 한눈에 보기 위해 JSON 형식으로 기록하였습니다.
실험 환경
- macOS + Firefox
- Flask (Python 3.7+)
- 동일 LAN 구성
# server.py
# Python 3.7+
from flask import Flask, request, make_response
import logging, datetime, json
app = Flask(__name__)
logging.basicConfig(filename='requests.log', level=logging.INFO, format='%(message)s')
def logreq():
info = {
'time_utc': datetime.datetime.utcnow().isoformat() + 'Z',
'remote_addr': request.remote_addr,
'method': request.method,
'path': request.path,
'user_agent': request.headers.get('User-Agent'),
'referer': request.headers.get('Referer'),
'cookies': dict(request.cookies),
'all_headers': dict(request.headers)
}
logging.info(json.dumps(info))
print(json.dumps(info, indent=2))
@app.route('/')
def index():
logreq()
resp = make_response("<html><body><h3>Test page</h3><p>Close incognito to clear session cookies.</p></body></html>")
resp.set_cookie('test_cookie', 'hello_from_server', httponly=True)
return resp
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9999, debug=False)
해당 코드는 사용자의 접속 정보를 request.log 파일에 저장합니다.
서버는 응답 시 쿠키(test_cookie)를 함께 전송하도록 되어 있습니다.
따라서 처음 접속한 로그에는 쿠키가 존재하지 않지만, 한 번 접속한 이후에는 동일 세션 내에 쿠키가 로그에 포함되어 기록됩니다.
실험 과정
| 단계 | 환경 | 결과 |
| 1 | 일반 모드 | 쿠키 생성, 유지, 로그 기록됨 |
| 2 | 시크릿 모드 | 쿠키 분리, 세션 내 유지, 로그 기록됨 |
| 3 | 시크릿 창 모두 닫고 재접속 | 쿠키 초기화, 로그는 남음 |
로그 일부
# 일반 브라우저 로그
# 접속
{
"time_utc": "2025-10-03T16:23:46.038675Z",
"remote_addr": "192.168.1.80",
"method": "GET",
"path": "/",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"referer": null,
"cookies": {},
"all_headers": {
"Host": "192.168.1.120:9999",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Priority": "u=0, i"
}
}
# 새로고침 후
{
"time_utc": "2025-10-03T16:24:46.241883Z",
"remote_addr": "192.168.1.80",
"method": "GET",
"path": "/",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"referer": null,
"cookies": {
"test_cookie": "hello_from_server"
},
"all_headers": {
"Host": "192.168.1.120:9999",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Cookie": "test_cookie=hello_from_server",
"Upgrade-Insecure-Requests": "1",
"Priority": "u=0, i"
}
}
# 시크릿 모드
# 접속
{
"time_utc": "2025-10-03T16:24:03.348568Z",
"remote_addr": "192.168.1.80",
"method": "GET",
"path": "/",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"referer": null,
"cookies": {},
"all_headers": {
"Host": "192.168.1.120:9999",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Sec-Gpc": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Priority": "u=0, i"
}
}
# 새로고침 후
{
"time_utc": "2025-10-03T16:24:59.775802Z",
"remote_addr": "192.168.1.80",
"method": "GET",
"path": "/",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"referer": null,
"cookies": {
"test_cookie": "hello_from_server"
},
"all_headers": {
"Host": "192.168.1.120:9999",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Sec-Gpc": "1",
"Connection": "keep-alive",
"Cookie": "test_cookie=hello_from_server",
"Upgrade-Insecure-Requests": "1",
"Priority": "u=0, i"
}
}
# 시크릿 모드 창 닫은 후 재접속
{
"time_utc": "2025-10-03T16:25:34.555334Z",
"remote_addr": "192.168.1.80",
"method": "GET",
"path": "/",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"referer": null,
"cookies": {},
"all_headers": {
"Host": "192.168.1.120:9999",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Sec-Gpc": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Priority": "u=0, i"
}
}
결과
일반 브라우저에서는 세션이 종료되더라도 쿠키가 유지되는 반면, 시크릿 모드에서는 세션이 종료되면 쿠키가 완전히 삭제됩니다.
시크릿 모드는 로컬 저장을 차단하지만, 네트워크 요청 자체는 여전히 서버에 남습니다.
즉, 사용한 컴퓨터에는 기록이 남지 않지만 서버, 네트워크에는 흔적이 남는 것입니다.
사람들이 오해하는 "익명"이 아닌 "로컬 프라이버시"에 가까운 것 같습니다.
5. 사람들의 오해
1. 시크릿 모드면 기록이 전혀 남지 않는다.
- 로컬에는 남지 않지만, 서버 및 네트워크에는 저장됩니다.
2. IP 추적이 불가능하다.
- IP는 그대로 노출됩니다.
3. 광고 추적이 차단된다.
- 세션 사용 중에는 여전히 추적이 가능합니다.
6. 추가적인 보안 조치
따라서 시크릿 모드만으로는 익명성을 보장할 수 없다는 것을 알 수 있습니다.
하지만 VPN, Tor, DNS 암호화 등 추가 기술을 함께 사용하여 개인정보를 보호할 수 있습니다.
| 방법 | 효과 | 설명 |
| VPN | IP 주소 변경, 트래픽 암호화 | ISP, 회사 네트워크 추적 차단 |
| Tor 브라우저 | 완전한 경로 익명화 | 여러 노드를 경유하여 신원을 숨김 |
| DNS over HTTPS | DNS 요청 암호화 | ISP의 도메인 감시 차단 |
| 프록시 서버 | 중간 IP 은닉 | 완전한 익명은 아님 |
7. 시크릿 모드를 사용하는 경우
1. 공용으로 사용하는 컴퓨터에서 민감한 활동을 할 때
- 예: PC방, 학교, 도서관, 회사 등
- 브라우징 기록, 쿠키, 자동 로그인 정보가 남지 않아 개인 계정 노출을 방지할 수 있습니다.
2. 한 브라우저에서 여러 계정에 동시 로그인 할 때
- Gmail 계정 2개, SNS 계정 2개를 동시에 접속해야 할 때
- 시크릿 모드 창을 별도로 열면 쿠키 충돌 없이 각각 로그인이 가능합니다.
3. 자동 로드인, 자동 완성 등 브라우징 저장 기능을 사용하고 싶지 않을 때
- ID/PW, 입력 폼 기록, 방문 기록 등이 저장되지 않아 일회성 접속을 위해 사용합니다.
4. 로그인 상태를 분리한 상태로 사이트 동작을 비교하고 싶을 때
- 일반 브라우저에서는 로그인 상태, 시크릿 모드에서는 비로그인 상태로 접속하여 사용자 상태별 응답 비교에 사용합니다.
8. 결론
"시크릿 모드는 완전한 익명이 아니다."
아무 생각 없이 종종 사용하던, 무엇이든 보호가 되겠지라 생각했던 시크릿 모드에 대해 알아보았습니다.
시크릿 모드는 단순히 기기 내부의 기록이 남지 않도록 하는 기능일 뿐, 네트워크나 서버에는 그대로 기록이 남기에 완전한 익명이 아니라는 사실을 확인할 수 있었습니다.
또한 개인정보를 보호하기 위해선 시크릿 모드와 추가로 VPN, Tor 등 추가적인 보안 조치가 필요하다는 것을 알게 되었습니다.
평소에 무심코 사용하던 기능에 대해 간단한 실습과 함께 알아보니 재미있었고, 더욱 공부를 해야 되겠다는 것을 느꼈습니다.
'Knights Frontier_1st > 기술문서 | 블로그' 카테고리의 다른 글
| [ Knights Frontier ] PAC 보호 기법 (0) | 2026.03.25 |
|---|---|
| [ Knights Frontier ] CodeQL 원리와 사용법 분석 (1) | 2026.03.23 |
| [ Knights Frontier ] CVE-2026-20841 1-day 분석 (0) | 2026.03.13 |
| [ Knights Frontier ] 블록체인 기반의 공급망 공격 탐지 툴 제작 (0) | 2025.10.16 |
| [ Knights Frontier ] 쿼드콥터(드론)를 이용한 무선AP 모의해킹 (0) | 2025.10.14 |