다른 세션 간 데이터 공유금지, 세션 ID 노출금지, (재)로그인시 세션ID 변경, 세션종료(비활성화, 유효기간 등) 처리 등 세션을 안전하게 관리할 수 있는 방안을 설계
(캡슐화) 잘못된 세션에 의한 데이터 정보 노출
Shylock’라고 명명된 이 맬웨어는 온라인 뱅킹 고객을 대상으로 고객이 계정을 로그인하면 세션을 하이재킹 할 수 있다.
이 맬웨어로 공격자는 실시간 채팅 창을 열고 은행 고객상담센터 담당자인 것처럼 속여 고객에게 세션이 보류됐다고 알린 후, 실시간 채팅으로 고객들의 정보를 빼내는 수법을 사용한 것으로 알려졌다.
① 세션 간 데이터가 공유 금지
② 세션이 안전하게 관리
③ 세션ID가 안전하게 관리
① 스레드로 동작하는 웹애플리케이션의 컨트롤러 컴포넌트나, 싱글톤 객체로 생성되는 서비스 컴포넌트를 설계하는 경우
클래스 멤버 변수나 클래스변수는 세션 간에 데이터 공유
클래스 설계 시 읽고 쓰기가 가능한 변수를 사용하지 않도록 제한
② 시스템 내의 모든 페이지에 대하여 로그아웃이 가능하도록 UI를 설계, 로그아웃을 요청하면 사용자에게 할당된 세션을 완전히 제거하는 API를 사용
Java의 경우 session.invalidate() 메소드를 사용하여 세션에 저장된 정보를 완전히 제거할
세션 타임아웃 시간은 중요기능의 경우 2~5분, 위험도가 낮은 경우에는 15~ 30분으로 설정
이전 세션이 종료되지 않은 상태에서 새로운 세션이 생성되지 않도록 제한
웹 브라우저 종료로 인한 세션종료는 서버 측에서 인지할 수 없으므로, 일정시간 동안 사용되지 않는 세션 정보는 강제적으로 삭제
중복 로그인 미허용시, 새로운 로그인 세션 생성 시 이전에 생성된 로그인 세션을 종료하거나, 새로이 세션이 연결되지 않도록 검증하는 정책 수립
세션ID가 포함된 쿠키에 대해 HttpOnly 속성을 설정하여 자바스크립트로 조회할 수 없도록 만들어 XSS공격에 대응
사용자가 패스워드를 변경 시 현재 활성화된 세션을 삭제하고 다시 할당
③ 세션ID의 안전한 관리
(ㄱ) 세션ID 생성
세션ID는 안전한 서버에서 생성해서 사용
세션ID는 최소 128비트의 길이로 생성되어야 하며, 안전한 난수 알고리즘을 적용하여 예측이 불가능한 값이 사용
(ㄴ) 세션ID 사용
URL Rewrite 기능을 사용하는 경우 세션ID가 URL에 노출될 수 있으므로, 사용하지 않도록 설계
(ㄷ) 세션ID 폐기
로그인 성공 시 로그인 전에 할당받은 세션ID는 파기하고 새로운 값으로 재할당하여 세션ID 고정 공격에 대응
장기간 접속되어 있는 경우 세션ID의 노출위험이 커지므로, 일정시간 주기적으로 세션ID를 재할당
인증 시 일정한 규칙이 존재하는 세션ID가 발급되거나 세션 타임아웃을 너무 길게 설정한 경우 공격자에 의해 사용자 권한이 도용될 수 있는 취약점
다중 스레드 환경인 java의 서블릿(servlet) 등에서는 정보를 저장하는 멤버변수가 포함되지 않도록 하여, 서로 다른 세션 간에 데이터를 공유하지 않도록 해야 한다.