세션 간 데이터가 공유되지 않도록 설계해야 한다.
① 모든 페이지에서 로그아웃을 요청할 수 있도록 로그아웃 버튼을 지정된 위치에 노출되도록 한다.
② 사용자가 로그아웃을 요청하면 session.invalidate() 메소드를 사용하여 세션에 저장된 정보를 완전히 제거한다.
③ 세션 타임아웃은 15분으로 설정하고, 이전 세션이 종료되지 않은 상태에서 새로운 세션이 생성되지 않도록 한다.
④ 일정시간 동안 사용되지 않는 세션은 강제적으로 삭제한다.
⑤ 세션 ID가 포함된 쿠키는 HttpOnly 속성을 설정하여 전달한다.
⑥ 사용자가 비밀번호를 변경한 경우, 현재 활성화된 세션을 모두 삭제하고 다시 할당한다.
① 세션ID는 서버에서 생성한 것을 사용한다.
② URL Rewrite 기능이 사용되지 않도록 한다.
③ 인증에 성공하면 인증전에 할당한 세션ID를 파기하고 세션ID를 재할당하여 전달한다.
④ 주기적으로 세션ID를 재할당하도록 한다.
@Controller
@RequestMapping(“/board”) public class BoardController {
private int pageNo = 1; /* 세션 간 공유가 발생 */
<%!
String value = “”; /* 서블릿 클래스의 멤버 변수로 변환 */
:
%>
Singleton Pattern
using System;
namespace SingletonExamples
{
// Broken, non thread-save solution.
// Don't use this code.
public class Singleton
{
private static Singleton _instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}
}
thread-safe code
using System;
namespace SingletonExamples
{
public class Singleton
{
private static Singleton _instance;
private static readonly object _lock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}
}
}
performance thread-safe code
using System;
namespace SingletonExamples
{
public class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance
{
get
{
return instance.Value;
}
}
private Singleton()
{
}
}
}
출처: 행정안전부 인터넷진흥원 소프트웨어 보안약점 진단 가이드