오늘 끝나면
인증·세션 공격
- ✓인증·세션 공격의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 인증이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
로그인 우회·세션 탈취와 방어 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
화이트해킹 · 07
인증·세션
공격
로그인은 한 번만 한다. 그 뒤로 나를 기억하는 건 세션 토큰 한 조각이다.
이 조각을 훔치거나 미리 심으면 비번 없이도 남이 된다.
교육·방어 목적이다. 실제 공격 코드 없이 원리만 안전하게 본다.
세션 = 로그인 뒤의 출입증
HTTP는 매 요청을 처음 보는 사람처럼 대한다. 방금 로그인한 것도 다음 요청에선 기억하지 못한다.
그래서 로그인에 성공하는 순간 서버가 세션 토큰을 발급한다.
이후 모든 요청에 이 토큰을 같이 보낸다. 보통은 쿠키에 담겨 자동으로 따라간다.
서버는 토큰만 보고 “아, 그 사람” 하며 통과시킨다.
즉 토큰은 출입증이다. 비번을 모르더라도 출입증만 손에 넣으면 그 사람으로 통한다.
그래서 공격의 표적이 비번에서 토큰으로 옮겨간다.
약한 토큰은 다음 값이 보인다
토큰이 순번이나 시각으로 만들어지면, 내 토큰 하나만 봐도 남의 다음 토큰이 보인다.
약한 토큰은 공격자가 좁은 후보만 던져도 금방 맞는다.
강한 토큰은 같은 횟수로는 적중 확률이 사실상 0이다.
이건 안전한 개념 시뮬레이션이다. 진짜 서버를 치지 않고 추측 공간의 크기 차이만 보여준다.
핵심은 하나다. 토큰에 패턴이 있으면 그게 곧 구멍이다.
방어는 예측 불가한 큰 무작위 값을 쓰는 것이다. 추측 공간을 사람이 평생 못 훑을 만큼 키운다.
순번·시각 기반. 공격자가 본 직전 토큰 바로 다음을 좁게 찍는다.
다음 토큰은 101 부근일 게 뻔하다. 좁은 9칸만 던지면 된다.
약한 토큰은 좁은 후보 공간이라 몇 번 만에 맞는다. 패턴이 곧 구멍이다.
토큰 탈취, 가로채고, 새어 나가고
토큰이 무작위로 강해도, 전송 중에 새면 추측이 필요 없다. 그냥 주워 쓰면 된다.
평문(HTTP)으로 보내면 같은 와이파이의 누군가가 통째로 본다.
페이지에 XSS(6강) 구멍이 있으면 스크립트가 쿠키를 긁어간다.
토큰이 URL이나 로그에 찍히면 거기서도 흘러나간다.
주운 토큰을 자기 요청에 붙이면 서버는 의심 없이 통과시킨다. 비번도 MFA도 묻지 않는다.
그래서 방어는 새는 길을 막는 것이다. HTTPS를 강제하고, 쿠키에 HttpOnly · Secure · SameSite를 걸고, URL과 로그에는 토큰을 남기지 않는다.
HTTP로 보내면 같은 망의 누군가가 통째로 본다
방어 · HTTPS 강제
심어진 스크립트가 document.cookie를 긁어간다
방어 · HttpOnly 쿠키
토큰이 주소나 서버 로그에 그대로 찍힌다
방어 · URL·로그에 토큰 금지
세션 고정, 미리 심어두는 함정
탈취가 “남의 토큰을 뺏는 것”이라면, 세션 고정은 “내 토큰을 남에게 미리 심는 것”이다.
공격자가 먼저 토큰 하나를 받아, 그 값을 링크나 스크립트로 피해자에게 심는다.
피해자가 그 상태로 로그인한다. 서버가 토큰을 안 바꾸면, 로그인된 세션이 곧 공격자가 아는 그 값이 된다.
공격자는 같은 토큰을 들고 로그인된 상태로 들어간다.
그래서 방어 규칙은 단순하다.
로그인 직후 세션 ID를 무조건 새로 발급(rotate)한다. 로그인 전에 쓰던 토큰은 즉시 폐기한다.
예전 토큰을 그대로 들고 가는 일 자체를 못 하게 막는다.
방어 · 로그인 직후 재발급
AAA → 폐기 · 새 토큰 7Qk…z9
예전 값이 죽으니 공격자가 든 AAA는 빈 출입증이 된다
방어, 예측 불가 · HTTPS · MFA · 짧은 만료
정리하면 방어는 한 방이 아니라 네 겹을 겹치는 것이다. 하나가 뚫려도 다음이 막는다.
예측 불가 토큰은 큰 무작위 값이다. 추측을 무의미하게 만든다.
HTTPS · 안전 쿠키는 전송 중이나 스크립트로 새는 길을 막는다.
MFA는 토큰이나 비번이 새도 한 겹을 더 둔다. 그 사람만의 두 번째 증거를 요구한다.
짧은 만료 · 로그인 시 재발급은 주운 출입증의 유효기간을 깎는다.
토큰이 새도 곧 죽어 있으니 훔칠 값이 줄어든다.
Q. 세션 탈취를 어렵게 하려면? (한 줄로)
예측 불가한 무작위 토큰 + HTTPS·안전 쿠키 + 짧은 만료(거기에 MFA·로그인 시 재발급).예측 불가 토큰은 추측을 막고, HTTPS·쿠키는 가로채기를 막고, 짧은 만료는 주워 쓰는 시간을 막는다.
한 겹이 아니라 겹쳐야 한다. 하나가 뚫려도 나머지가 버틴다.