[설계단계] 4. 세션통제

김경민·2022년 7월 10일
1

security

목록 보기
11/15
post-thumbnail

[설계단계] 4. 세션통제

요구사항 내용

세션 간 데이터가 공유되지 않도록 설계해야 한다.

구현방안

1. 세션이 안전하게 관리되도록 해야 한다.

① 모든 페이지에서 로그아웃을 요청할 수 있도록 로그아웃 버튼을 지정된 위치에 노출되도록 한다.
② 사용자가 로그아웃을 요청하면 session.invalidate() 메소드를 사용하여 세션에 저장된 정보를 완전히 제거한다.
③ 세션 타임아웃은 15분으로 설정하고, 이전 세션이 종료되지 않은 상태에서 새로운 세션이 생성되지 않도록 한다.
④ 일정시간 동안 사용되지 않는 세션은 강제적으로 삭제한다.
⑤ 세션 ID가 포함된 쿠키는 HttpOnly 속성을 설정하여 전달한다.
⑥ 사용자가 비밀번호를 변경한 경우, 현재 활성화된 세션을 모두 삭제하고 다시 할당한다.

2. 세션ID가 안전하게 관리되도록 해야 한다.

① 세션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()
        {
        }
    }
}

출처: 행정안전부 인터넷진흥원 소프트웨어 보안약점 진단 가이드

소프트웨어 보안약점 진단가이드

Lazy Initialization

0개의 댓글