블로그

코더의 보안 정복: 공유 및 학습 시리즈 - 세션 관리 취약점

January 31, 2019
자프 카란 싱

웹사이트에 접속하여 로그인을 합니다. 평소처럼 구매하고 싶은 상품을 장바구니에 담습니다. 그런데 실수로 브라우저 탭을 닫아버렸습니다. 잠시 당황했지만, 다시 브라우저에 해당 사이트 주소를 입력하고 "Enter" 키를 누릅니다. 사이트에 다시 접속하니 로그인이 유지되어 있고, 장바구니에 담았던 상품들도 그대로 남아 있습니다. 다행입니다.

사이트는 어떻게 재인증 없이 사용자가 누구인지 알 수 있었을까요? 바로 세션을 사용했기 때문입니다. 세션은 웹을 사용할 때 원활한 사용자 경험을 제공하는 핵심 요소입니다. 하지만 세션을 잘못 관리하면 공격자가 악용할 수 있는 보안 취약점이 발생할 수 있습니다.

이제 세션 관리의 의미, 취약한 세션 관리가 초래하는 위험, 그리고 올바른 세션 관리 방법을 살펴보겠습니다.

세션 관리 취약점 이해하기

세션은 애플리케이션의 특정 사용자에 대해 서버에 저장되는 값을 의미합니다. 세션이 필요한 이유는 두 가지입니다. 첫째, HTTP는 상태를 저장하지 않는(stateless) 프로토콜이기 때문입니다. 각 요청은 독립적이며 이전이나 이후의 요청에 대한 정보를 알지 못합니다. 세션은 서버가 누가 요청을 보냈는지 추적하도록 돕습니다. 그렇지 않다면 버튼이나 링크를 클릭할 때마다 매번 로그인해야 할 것입니다.

세션이 필요한 두 번째 이유는 사용자 권한 부여 때문입니다. 세션 식별자를 사용하면 시스템 내에서 특정 권한을 가진 특정 사용자를 인식할 수 있습니다. 애플리케이션은 해당 사용자가 누구인지, 무엇을 할 수 있는지 알게 됩니다.

세션은 두 가지 구성 요소로 이루어집니다. 서버 측 데이터 저장소는 세션 식별자를 저장하고 이를 사용자 ID나 장바구니 정보와 같은 사용자 정보에 매핑합니다. 동일한 세션 식별자가 쿠키 형태로 브라우저에 전송됩니다. 쿠키는 브라우저에 의해 사용자 시스템에 저장됩니다. 클라이언트는 요청을 보낼 때마다 쿠키를 함께 전달하여 서버가 해당 요청이 동일한 사용자로부터 온 것임을 알 수 있게 합니다. 대부분의 애플리케이션은 인증 전후의 사용자를 추적하기 위해 세션을 사용합니다.

올바른 세션 관리는 애플리케이션 보안에 필수적입니다. 유효한 세션 ID는 사용자 이름/비밀번호 또는 2단계 인증 토큰과 동일한 수준의 신뢰도를 가집니다.

부실한 세션 관리가 위험한 이유

부실한 세션 관리는 계정 탈취로 이어질 수 있습니다. 이는 고객 데이터 도난이나 부정 결제와 같은 피해를 야기할 수 있습니다. 공격자가 유효한 세션 ID를 획득하는 방법은 여러 가지가 있습니다.

사용자가 시스템에 로그인하는 등 중요한 시점에 세션이 변경되지 않거나, URL을 통해 세션 식별자를 설정할 수 있는 경우 세션 고정 공격(session fixation attack)이 발생할 수 있습니다. 이러한 방식으로 세션 식별자를 설정하면 동일한 인증 소스를 사용하는 여러 애플리케이션에서 사용자의 로그인을 유지하는 데 악용될 수 있습니다. 이 경우 공격자는 웹사이트에 접속하여 세션 ID를 획득합니다. 그런 다음 세션 ID가 포함된 URL을 이메일을 통해 의심하지 않는 피해자에게 보냅니다. 피해자가 이메일의 URL을 클릭하고 웹사이트에 로그인하면, 로그인 시 세션 ID가 갱신되지 않을 경우 공격자는 유효한 인증 세션 ID를 갖게 됩니다. 이를 통해 계정을 완전히 탈취할 수 있습니다.

부실한 세션 관리를 노리는 또 다른 공격은 무차별 대입(brute-force) 추측 공격입니다. 개발자가 자체적인 세션 관리 시스템을 만들 때, 추측하기 쉬운 세션 ID를 사용하는 경우가 많습니다. 예를 들어 순차적인 숫자(1, 2, 3)나 예측 가능한 패턴이 이에 해당합니다. 공격자는 유효한 세션 ID가 발견될 때까지 계속해서 세션 ID를 추측합니다. 이 역시 계정 탈취로 이어집니다.

일정 시간이 지난 후 자동으로 무효화되지 않는 세션은 사용자 공격에 악용될 수 있습니다. 성공적인 사이트 간 요청 위조(cross-site request forgery) 공격은 사용자가 사이트를 떠난 후에도 세션이 유효할 때 발생합니다. 예를 들어 공격자가 사용자가 방문하는 사이트에 iframe이나 이미지를 배치한다고 가정해 봅시다. "src" 속성을 취약한 사이트의 URL로 설정하면 사용자를 대신하여 특정 동작이 수행됩니다. 예를 들어, 취약한 뱅킹 애플리케이션이 사용자의 허가 없이 공격자의 계좌로 돈을 이체하도록 만들 수 있습니다.

세션 관리는 까다롭고 그 취약점은 치명적일 수 있습니다. 하지만 이는 잘 알려진 문제이며 충분히 해결 가능합니다.

안전하지 않은 세션 관리 무력화하기

세션 관리는 모든 웹 애플리케이션의 핵심 요소입니다. 따라서 많은 웹 개발 프레임워크에는 세션 관리 기능이 내장되어 있습니다. 이러한 시스템은 전문가들에 의해 검증되어 문제점이 제거되었습니다. 이를 활용하십시오.

올바른 세션 관리의 몇 가지 공통적인 특징은 다음과 같습니다.

     공격자가 추측할 수 없는 무작위 세션 ID 생성

     사용자가 로그아웃하면 세션 무효화

     일정 시간이 지나면 세션 자동 무효화

     로그인 후 세션 ID 변경

     무차별 대입 공격을 방지하기 위해 128비트 이상의 세션 ID 사용

Spring, ASP.NET Core, Rails, Django와 같은 웹 프레임워크는 이러한 속성을 갖추고 있으므로, 이 경우 더 높은 보안 표준을 위해 해당 프레임워크를 사용해야 합니다.

결론: 세션 관리 시스템을 직접 처음부터 만들지 마십시오.

세션 ID가 생성되면 이를 보호해야 합니다. 세션 쿠키의 Secure 및 HttpOnly 플래그를 "true"로 설정하십시오. 이렇게 하면 JavaScript로 값을 가져올 수 없으며 브라우저가 HTTPS를 통해서만 쿠키를 전송하게 되어, 전송 중 공격자가 세션을 탈취하는 것을 방지할 수 있습니다.

세션 보안 강화

무료 학습 리소스를 확인하여 안전한 세션 관리에 대해 자세히 알아보세요. 세션 보안 방법을 익히면 사용자 계정 탈취, 평판 하락, 보안 침해로 인한 수익 손실을 방지하는 데 도움이 됩니다. 세션을 안전하게 보호하여 사용자를 지키세요.

태그라인

배포 전 AI 기반 개발 거버넌스 확보

AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.

데모 예약하기
리소스 라이브러리

더 많은 블로그 살펴보기

보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.

전체 보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

하나의 보안 문화: Sage는 어떻게 챔피언 프로그램을 구축했는가

Sage가 유연하고 관계 중심적인 접근 방식을 통해 보안을 강화하고, 200명 이상의 보안 챔피언을 양성하며 실질적인 위험 감소를 달성한 사례를 확인해 보세요.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

2026년 사이버 보안 인식의 달: 기업 방어의 핵심, AI 보안 이해하기

주요 AI 기업 대부분이 안전 가이드라인이 마련될 때까지 AI 개발 속도를 전 세계적으로 늦춰야 한다고 공개적으로 촉구하는 시점에 이르렀지만, 사실 심각한 보안 문제는 이미 현실화되었습니다. 이로 인해 AI 도입에 따른 금전적 비용과 위험 부담이 계속 쌓이면서 수많은 보안 책임자와 경영진이 절박한 상황에 놓였습니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

인에이블러 8: 프로그램 브랜딩

성공적인 보안 코딩 프로그램을 위해서는 훌륭한 콘텐츠 그 이상의 것이 필요합니다. 인에이블러 8에서는 브랜딩을 통해 참여를 누구나 선망하는 위상 중심의 경험으로 바꾸는 방법을 알아봅니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

이제 모든 직원이 AI 사이버 보안의 최전선에 있습니다

엔터프라이즈 기술 환경은 너무 늦기 전까지는 아무도 예상하지 못한 속도로 변화하고 있습니다. 우리는 공식적으로 사람이 직접 작성한 코드와 기본적인 코파일럿 지원의 시대를 지나 '에이전트 기반 개발 수명 주기(ADLC)'의 시대로 진입했습니다. 자율형 AI 에이전트는 여러 기능 전반에 걸쳐 전례 없는 효율성을 약속하지만, 동시에 완전히 새로운 차원의 보안 및 규제 위험을 야기합니다.

더 알아보기

배포 전 AI 기반 개발 보안 확보

소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.

데모 예약하기
항목이 없습니다.