본문 바로가기
FullStack/10. WeB

[취약점] 세션 간 데이터 누출

by nakanara 2024. 6. 5.
반응형

Pixabay - Kris 님의 이미지 입니다.

개발 과정에서 사소하게 지나칠 수 있는 세션 간 데이터 누출 중 빈번하게 실수하는 예시를 작성하였습니다..

일반적으로 JSP를 통해 개발할 경우 3가지 방법으로 선언이 가능합니다.

- 스크립트릿(<% %>): 지역변수이며, 상단에 선언하여 업무 로직 작성(지역 변수)
- 표현식(<%= %>): 선언된 값을 표시하기 위한 표현식(표현식)
- 선언문(<%! %>: 페이지 안에서 사용할 수 있는 멤버 변수, 함수 생성(공유)

선언문은 쓰레드에 종속적인 관계이기 때문에 스크립트릿과 선언문에 기능적 차이를 명확하게 할 필요성 있습니다.

아래 간단하게 작성된 코드가 있습니다.
위 코드를 기준으로 새로고침할 경우 스크립트릿 변수는 초기화되지만, 선언문에 포함된 변수는 동일한 쓰레드일 경우 초기화되지 않습니다.

<%
    // 페이지마다 초기화
    int count = 0;
%>
<!doctype html>
<html lang="ko">
<head>
</head>
<body>

<h1>스크립트릿(Scriptlet)</h1>
<pre>
페이지마다 변수가 초기화
&lt;%
    // 페이지마다 초기화
    int count = 0;
%&gt;
</pre>
스크립트릿 변수(지역변수): <%= count++ %>
</br>

<h1>선언문(Declaration)</h1>
<pre>
페이지마다
&lt;%!
    /* 변수의 저장 */
    int stCount = 0;
%&gt;
</pre>
선언된 변수(공유되는 현상): <%= stCount++ %>

<pre>
JSP에서 선언문(Declaration)으로 정의된 변수는 쓰레드 안전성(Thread Safety) 문제를 일으킬 수 있습니다.
이는 JSP 페이지가 멀티쓰레드 환경에서 실행되기 때문입니다.
JSP는 기본적으로 멀티쓰레드 환경에서 실행되며,
여러 클라이언트가 동시에 JSP 페이지에 접근할 때 동일한 JSP 인스턴스가 여러 쓰레드에서 공유될 수 있습니다.
</pre>
</body>

<%!
    /* 변수의 저장 */
    int stCount = 0;
%>
</html>

# 결과화면

다른 브라우저에서 변수가 공유되고 있는 현상.

 

# 해결 방법

1. 병목이 예상되는 변수는 지역변수(스크립트릿)로 변경

<% int count = 0; %>

2. 중요한 기능일 경우 'synchronized' 선언을 통한 Thread에 대한 대비

<%! 
    private int counter = 0; 
    public synchronized int getCounter() {
        return counter++;
    }
%>

<%= getCounter() %>

 

3. <%@ page isThreadSafe="false" %> 지시어 사용

JSP 페이지에 대해 싱글쓰레드 모델을 사용하도록 지시합니다.
그러나 이 방법은 성능 저하를 일으킬 수 있으므로 사용 자제. 불가피한 경우 검토 필요.

<%@ page isThreadSafe="false" %>

 

반응형