반응형
개발 과정에서 사소하게 지나칠 수 있는 세션 간 데이터 누출 중 빈번하게 실수하는 예시를 작성하였습니다..
일반적으로 JSP를 통해 개발할 경우 3가지 방법으로 선언이 가능합니다.
- 스크립트릿(<% %>): 지역변수이며, 상단에 선언하여 업무 로직 작성(지역 변수)
- 표현식(<%= %>): 선언된 값을 표시하기 위한 표현식(표현식)
- 선언문(<%! %>: 페이지 안에서 사용할 수 있는 멤버 변수, 함수 생성(공유)
선언문은 쓰레드에 종속적인 관계이기 때문에 스크립트릿과 선언문에 기능적 차이를 명확하게 할 필요성 있습니다.
아래 간단하게 작성된 코드가 있습니다.
위 코드를 기준으로 새로고침할 경우 스크립트릿 변수는 초기화되지만, 선언문에 포함된 변수는 동일한 쓰레드일 경우 초기화되지 않습니다.
<%
// 페이지마다 초기화
int count = 0;
%>
<!doctype html>
<html lang="ko">
<head>
</head>
<body>
<h1>스크립트릿(Scriptlet)</h1>
<pre>
페이지마다 변수가 초기화
<%
// 페이지마다 초기화
int count = 0;
%>
</pre>
스크립트릿 변수(지역변수): <%= count++ %>
</br>
<h1>선언문(Declaration)</h1>
<pre>
페이지마다
<%!
/* 변수의 저장 */
int stCount = 0;
%>
</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" %>
반응형
'FullStack > 10. WeB' 카테고리의 다른 글
전자 결재 연동 시 세션 끊김 현상 (0) | 2022.12.16 |
---|---|
폐쇄망에서 HTTPS 접속 시 IE 페이지 표시 안 되는 현상 (0) | 2021.11.23 |
Apache Proxy 설정 (0) | 2021.03.12 |
[HTTPS] https + ie11 에서 fontawesome가 표시 안되는 현상 (0) | 2020.12.20 |
[APACHE] 로컬에서 https 테스트 환경 (0) | 2020.12.18 |