세션
세션(session)은 웹사이트가 '방금 로그인한 그 사람'을 기억하려고 서버에 만들어 두는 이용 기록이에요. 브라우저는 세션 번호만 쿠키에 담아 요청마다 보내요.
목차 보기
세션(session)은 웹사이트가 "방금 로그인한 그 사람"을 기억하려고 서버에 만들어 두는 이용 기록이에요. 옷 보관소와 비슷해요. 옷(내 정보)은 보관소(서버)에 두고, 나는 번호표(세션 ID)만 들고 다녀요. 번호표를 보여 주면 내 옷을 찾아 줘요.
한눈에 보기
- 웹은 원래 요청 하나하나를 따로 처리해서 앞 요청을 기억하지 못해요. 세션이 그 빈틈을 메워요.
- 로그인하면 서버가 세션 ID 를 만들어 쿠키로 주고, 브라우저는 요청마다 그 쿠키를 다시 보내요.
- 직접 만든 연습 서버에서 쿠키 없이 물으면 401, 쿠키를 보내면 200 이 나왔어요.
로그인 세션은 어떻게 돌아가요?
- 아이디·비밀번호로 로그인해요.
- 서버가 맞는지 확인하고, 아무도 맞힐 수 없는 긴 무작위 번호(세션 ID)를 만들어요. "이 번호 = 이 사람"을 서버 저장소에 적어 둬요.
- 서버는 응답 머리글
Set-Cookie로 번호를 브라우저에 줘요. - 브라우저는 그 사이트에 갈 때마다 번호를
Cookie머리글에 실어 보내요. - 서버는 번호로 저장소를 찾아 "아, 그 사람"이라고 알아봐요. 로그아웃하면 저장소에서 지워요.
직접 만들어 봤어요
원리를 보려고 파이썬 기본 기능만으로 20줄짜리 연습 서버를 만들어 2026년 10월 29일 우리 PC 에서 돌렸어요. /login 에 요청하면 세션을 만들고, /me 에서 누구인지 알려 줘요.
$ curl -s http://127.0.0.1:18923/me # 쿠키 없이
{"error": "not logged in"}
[HTTP 401]
$ curl -s -i -c jar.txt -X POST http://127.0.0.1:18923/login
HTTP/1.0 200 OK
Set-Cookie: sid=QwZ8RM…(가림); HttpOnly; SameSite=Lax; Path=/
{"login":"ok"}
$ curl -s -b jar.txt http://127.0.0.1:18923/me # 받은 쿠키를 다시 보냄
{"user": "demo"}
[HTTP 200]
같은 /me 주소인데 쿠키(번호표)가 있느냐에 따라 401(누구세요?)과 200(demo 님이군요)으로 갈렸어요. 서버가 기억하는 건 번호와 사람의 짝이고, 브라우저가 가진 건 번호뿐이에요.
실제 사이트는 어떻게 줘요?
같은 날 GitHub 첫 화면을 받아 보니 이런 쿠키를 줬어요(값은 가렸어요).
$ curl -sI https://github.com/ | grep -i set-cookie Set-Cookie: _gh_sess=…; path=/; HttpOnly; secure; SameSite=Lax Set-Cookie: logged_in=no; expires=Fri, 29 Oct 2027 …; HttpOnly; secure; SameSite=Lax
_gh_sess 에는 만료일(expires)이 없어요. 만료일이 없는 쿠키는 브라우저를 닫으면 사라져서 "세션 쿠키"라고 불러요. 붙어 있는 속성은 각각 이런 뜻이에요.
| 속성 | 뜻 |
|---|---|
| HttpOnly | 페이지 안 스크립트가 쿠키를 읽지 못하게 막아요. 악성 스크립트에 번호표를 뺏기지 않게요 |
| Secure | HTTPS 로만 보내요. 중간에서 엿보지 못하게요 |
| SameSite=Lax | 다른 사이트가 몰래 보낸 요청에는 쿠키를 잘 안 붙여요 |
| expires / Max-Age | 언제까지 보관할지예요. 없으면 브라우저를 닫을 때 지워요 |
세션과 쿠키는 뭐가 달라요?
| 구분 | 세션 | 쿠키 |
|---|---|---|
| 어디에 | 서버 | 내 브라우저 |
| 무엇을 | 누가 로그인했는지 같은 실제 정보 | 세션 ID 같은 작은 값(쿠키 하나에 보통 4KB 안팎) |
| 끝나는 때 | 로그아웃, 일정 시간 아무것도 안 할 때 | 정한 만료일, 또는 브라우저를 닫을 때 |
| 관계 | 쿠키 속 번호로 찾아요 | 세션을 찾는 번호표를 들고 다녀요 |
"세션이 만료되었습니다"는 왜 떠요?
- 오래 가만히 있었을 때 — 사이트가 정한 시간(예: 30분) 동안 아무 요청이 없으면 서버가 세션을 지워요. 은행·관리자 화면은 더 짧아요.
- 쿠키를 지웠을 때 — 번호표를 버렸으니 다시 로그인해야 해요.
- 다른 곳에서 로그인했을 때 — 한 계정에 세션 하나만 허락하는 사이트도 있어요.
- 서버를 다시 켰을 때 — 세션을 서버 메모리에만 두면 재시작할 때 모두 사라져요. 위 연습 서버도 그래요.
다른 뜻의 "세션"도 있어요
| 쓰는 곳 | 뜻 |
|---|---|
| 웹 로그인 | 이 글의 뜻. 로그인 상태를 기억하는 서버 쪽 기록 |
| 구글 애널리틱스(GA4) | 한 사람이 사이트에 들어와 머문 한 번의 방문. 기본값은 30분 동안 활동이 없으면 끝나요 |
| SSH·터미널 | 서버에 접속해 있는 동안의 연결 한 번 |
자주 하는 오해와 주의
- 쿠키에 비밀번호가 들어 있다 — 제대로 만든 사이트는 번호표(세션 ID)만 넣어요.
- 세션 ID 는 보여 줘도 된다 — 번호표를 가진 사람은 로그인한 것처럼 행동할 수 있어요. 개발자 도구 화면을 캡처해 올릴 때 쿠키 값은 가리세요.
- 로그아웃 대신 창만 닫으면 된다 — 만료일이 있는 쿠키는 남아요. 공용 PC 에서는 꼭 로그아웃하세요.
퓨쳐인프라에서는
퓨쳐인프라 콘솔은 이메일·비밀번호에 더해 인증 앱 코드로 한 번 더 확인하는 2단계 인증을 쓸 수 있어요. 휴대폰이 없을 때를 위해 백업 코드도 있어요. 번호표를 받기 전 문을 한 겹 더 두는 셈이에요.
직접 로그인 기능이 있는 앱을 만들었다면 앱 호스팅에 올리면 HTTPS 주소가 같이 붙어요. Secure 쿠키는 HTTPS 에서만 오가니 처음부터 HTTPS 로 시작하는 게 좋아요. 가입하면 2,000원 크레딧이 들어와요.
자주 묻는 질문
세션 방식과 토큰(JWT) 방식은 뭐가 달라요?
세션은 서버가 기록을 들고 있고 브라우저는 번호만 가져요. JWT 는 정보와 서명을 담은 토큰을 브라우저가 들고 다니고, 서버는 서명만 확인해요.
세션 유지 시간은 얼마가 적당해요?
사이트 성격에 따라 달라요. 돈이 오가는 화면은 짧게, 일반 서비스는 길게 두고 '로그인 유지' 선택지를 주는 경우가 많아요.
세션 하이재킹이 뭐예요?
남의 세션 ID 를 훔쳐 그 사람인 척 접속하는 공격이에요. HTTPS, HttpOnly·Secure 쿠키, 로그인 때 세션 ID 새로 발급하기로 막아요.
시크릿 창에서는 왜 로그인이 안 남아요?
시크릿 창을 닫으면 그 창의 쿠키가 모두 지워져서 번호표가 사라지기 때문이에요.
관련 용어
캐시 · OAuth · 2단계 인증 · 해시 · 500 에러
이 글의 숫자 출처
- 연습 서버·curl: 우리 PC(Windows, Python 3.12.8, curl 8.17), 2026-10-29. 코드는 원리 설명용이에요.
- 실제 쿠키: GitHub·Google 응답 머리글을 curl 로 확인(2026-10-29 22:54 KST), 값은 가림
- 쿠키 규칙: MDN — HTTP 쿠키 · RFC 6265
- GA4 세션: Google 애널리틱스 고객센터
- 작성: 서순명(솔리드그루 이사 · 퓨쳐인프라 — 국내 IDC 에서 클라우드 서버·앱 호스팅·AI API 를 운영) · 작성일 2026-10-29
- 운영사: 솔리드그루 · 사업자등록번호 875-44-00335 · 서울특별시 구로구 디지털로29길 38, 7층 707호 · 전화 02-6933-6229 · support@futureinfra.ai · 고객센터 · 이용약관
- 한계: 연습 서버는 원리를 보여 주려고 만든 20줄짜리 코드라 실제 서비스에 쓰면 안 돼요. 실제 사이트의 쿠키 값은 가렸어요.
- 이해관계: 퓨쳐인프라 콘솔 로그인 방식을 언급했어요(자사 서비스).
연관 서비스
많이 본 글
-
블로그
무료 도메인 사이트 추천 2026 — 내도메인.한국·DuckDNS 발급 방법
내도메인.한국·DuckDNS 처럼 계속 무료인 주소 10곳을 11월 3일 서울에서 다시 재고(6곳 6ms 안), 발급 순서·구글·네이버 무료 주소·'첫해 무료'의 2년째 값까지 정리했어요. -
블로그
도메인 구매 사이트 추천 2026 — 가비아·후이즈 등 15곳 갱신·이전비 비교
같은 .co.kr 도 등록업체 15곳의 3년 값이 3.8만~8.6만 원이에요(11월 3일 KRNIC 표). 갱신가·이전비·해외 업체 조건, 11월 인상 뒤 가비아 실제 화면, 구매처 확인과 기관이전까지 정리했어요. -
블로그
클로드 MCP·Gemini MCP 연동 방법 2026, MCP 서버 9곳
클로드 MCP(데스크톱·Claude Code)와 Gemini MCP 연동(Gemini CLI·안티그래비티·Gemini 앱·API) 등 9곳의 MCP 서버 연결법을 공식 문서로 정리했어요. 원격 57ms 실측과 오류 해결까지. -
블로그
Gemini 3.9 Flash 나왔나요? 지금 최신은 3.8 Flash — 3.7과 직접 잰 속도·비용
2026년 9월 22일 기준 Gemini 3.9 Flash는 미출시입니다. 최신 3.8 Flash의 사양·가격(2027년 2배 인상)과, 3.7 Flash와 같은 과제로 직접 잰 속도·비용·JSON 형식 준수 차이를 정리했습니다. -
블로그
서버비 한 달 얼마? 방문자 10만 명도 월 3만 2천 원(2026 계산)
월 방문자 1천·1만 명은 1만 4천 원, 10만 명은 3만 2천 원이에요. 요금제별 트래픽 기본 제공량까지 넣어 다시 계산하고 AWS·카페24·가비아·네이버클라우드 값과 숨은 비용을 비교했어요(2026-10-26 확인).
댓글 0
로그인하면 댓글을 남길 수 있습니다.