ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSESSIONID의 역할 및 생성과정 및 JSESSIONID가 필요없는경우
    자바웹프로그래밍 2024. 7. 23. 14:42
    728x90
    반응형

     

    JSESSIONID는 Java EE 및 Spring 기반 웹 애플리케이션에서 사용되는 세션 식별자(Session Identifier)입니다. 이 식별자는 서버가 클라이언트와의 세션을 관리하기 위해 사용됩니다. 세션은 서버와 클라이언트 간의 상태 정보를 유지하기 위한 기술로, HTTP의 무상태(stateless) 특성을 보완하기 위해 사용됩니다.

     

     

    JSESSIONID의 역할

    1. 세션 식별:
      • JSESSIONID는 서버에서 생성되며, 각 클라이언트에 대해 고유합니다. 클라이언트가 서버에 요청할 때마다 JSESSIONID를 사용하여 해당 요청이 어느 클라이언트로부터 왔는지 식별할 수 있습니다.
    2. 세션 상태 유지:
      • HTTP는 본래 무상태 프로토콜이므로, 각 요청 간에 상태를 유지하지 않습니다. JSESSIONID는 서버가 클라이언트의 세션 상태(예: 로그인 상태, 장바구니 정보 등)를 유지하는 데 사용됩니다.
    3. 보안:
      • JSESSIONID는 클라이언트와 서버 간의 통신을 보호하는 데 중요한 역할을 합니다. 이를 통해 세션 하이재킹(session hijacking) 등의 공격을 방지할 수 있습니다. 보안을 강화하기 위해 JSESSIONID 쿠키는 HttpOnly 및 Secure 속성을 설정할 수 있습니다.

    JSESSIONID 생성 과정

    1. 클라이언트의 첫 요청:
      • 클라이언트(브라우저)가 웹 애플리케이션에 처음으로 접근할 때, 서버는 클라이언트의 세션을 확인하기 위해 요청 헤더에 포함된 쿠키를 검사합니다.
      • 이 첫 요청에는 JSESSIONID 쿠키가 없을 것입니다.
    2. 서버에서 세션 생성:
      • 서버는 클라이언트의 요청에 JSESSIONID 쿠키가 없음을 인식하고, 새로운 세션을 생성합니다.
      • 새로운 세션을 생성할 때, 서버는 고유한 JSESSIONID를 생성합니다. 이 JSESSIONID는 세션을 고유하게 식별하기 위한 식별자입니다.
    3. JSESSIONID 쿠키 설정:
      • 서버는 생성한 JSESSIONID를 클라이언트에게 설정하기 위해 응답 헤더에 Set-Cookie 헤더를 포함합니다.
      • Set-Cookie 헤더에는 JSESSIONID와 함께 기타 쿠키 속성들이 포함됩니다(예: HttpOnly, Secure, Path, Max-Age 등).
    4. 클라이언트에서 JSESSIONID 저장:
      • 클라이언트(브라우저)는 서버의 응답을 수신하고, Set-Cookie 헤더를 통해 받은 JSESSIONID를 저장합니다.
      • 이후 클라이언트는 동일한 서버에 요청을 보낼 때마다 이 JSESSIONID를 요청 헤더의 Cookie 항목에 포함시켜 서버에 전송합니다.

    JSESSIONID 생성 및 사용 예제

    1. 기본 예제: Spring Boot 애플리케이션

    Spring Boot 애플리케이션 설정

    1. Spring Boot 프로젝트 생성:
      • Spring Initializr를 사용하여 새로운 Spring Boot 프로젝트를 생성합니다. Web과 Thymeleaf 디펜던시를 추가합니다.
    2. 애플리케이션 설정:
      • application.properties 파일에 필요한 설정을 추가합니다.
    3. 컨트롤러 작성:
    @Controller
    public class HomeController {
    
        @GetMapping("/")
        public String home(HttpSession session) {
            // 세션에 속성 추가
            session.setAttribute("username", "user1");
            return "home";
        }
    
        @GetMapping("/session")
        @ResponseBody
        public String sessionInfo(HttpSession session) {
            // 세션 속성 읽기
            String username = (String) session.getAttribute("username");
            return "Username in session: " + username + ", Session ID: " + session.getId();
        }
    }​

     

    Thymeleaf 템플릿 작성:

    • src/main/resources/templates/home.html 파일을 생성하고, 간단한 HTML을 작성합니다.

     

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Home</title>
    </head>
    <body>
        <h1>Welcome!</h1>
        <a th:href="@{/session}">Session Info</a>
    </body>
    </html>

     

     

    JSESSIONID 확인

    1. 애플리케이션 실행:
      • SpringBootApplication 클래스를 실행하여 애플리케이션을 시작합니다.
    2. 브라우저에서 확인:
      • 브라우저에서 http://localhost:8080으로 이동합니다.
      • home.html 페이지가 로드되고, 서버는 클라이언트에게 JSESSIONID 쿠키를 설정합니다.
      • 브라우저의 개발자 도구(F12)에서 Application 탭을 선택하고, Cookies에서 JSESSIONID 쿠키를 확인할 수 있습니다.
    3. 세션 정보 확인:
      • "Session Info" 링크를 클릭하여 http://localhost:8080/session으로 이동합니다.
      • 서버는 현재 세션의 ID와 세션에 저장된 속성(예: username)을 반환합니다.

    2. JSESSIONID 속성 설정

    JSESSIONID 쿠키는 다음과 같은 속성들을 설정하여 보안을 강화할 수 있습니다.

     

    HttpOnly:

    • 이 속성을 설정하면 JavaScript에서 쿠키에 접근할 수 없습니다. XSS 공격을 방지하는 데 도움이 됩니다.
    @Bean
    public ServletContextInitializer servletContextInitializer() {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setHttpOnly(true);
        };
    }

     

     

    Secure:

    • 이 속성을 설정하면 HTTPS 연결에서만 쿠키가 전송됩니다.
    @Bean
    public ServletContextInitializer servletContextInitializer() {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setSecure(true);
        };
    }

     

     

    SameSite:

    • 이 속성은 CSRF 공격을 방지하기 위해 사용됩니다. Strict, Lax, 또는 None 값으로 설정할 수 있습니다.
    @Bean
    public ServletContextInitializer servletContextInitializer() {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setSameSite("Strict");
        };
    }

     

     

     

    JSESSIONID가 필요하지 않은 경우

    1. Stateless 애플리케이션:
      • 애플리케이션이 세션을 사용하지 않고, 모든 요청을 독립적으로 처리할 수 있습니다. RESTful API는 일반적으로 무상태(stateless) 방식으로 동작하며, 각 요청이 이전 요청과 무관하게 처리됩니다.
    2. JWT 인증:
      • JSON Web Token (JWT)을 사용하여 클라이언트와 서버 간의 인증을 처리하는 경우, 서버 측에서 세션을 유지할 필요가 없습니다. JWT는 클라이언트가 각 요청마다 서버에 전달하여 인증 및 권한 부여를 수행합니다.

    JSESSIONID 제거 방법

    Spring Boot 애플리케이션에서 JSESSIONID를 생성하지 않도록 하려면 세션 관리를 비활성화하거나, 필요 시 세션을 제거하는 설정을 해야 합니다.

    1. 세션 비활성화

    Spring Boot에서 세션을 비활성화하려면 다음과 같이 설정할 수 있습니다.

     

     

    import org.springframework.boot.autoconfigure.session.DefaultCookieSerializerCustomizer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.session.web.http.CookieSerializer;
    import org.springframework.session.web.http.DefaultCookieSerializer;
    
    @Configuration
    public class SessionConfig {
    
        @Bean
        public DefaultCookieSerializerCustomizer cookieSerializerCustomizer() {
            return new DefaultCookieSerializerCustomizer() {
                @Override
                public void customize(DefaultCookieSerializer cookieSerializer) {
                    cookieSerializer.setUseHttpOnlyCookie(false);
                    cookieSerializer.setSameSite(null);
                    cookieSerializer.setCookieName("JSESSIONID");
                    cookieSerializer.setUseSecureCookie(false);
                    cookieSerializer.setPath("/");
                    cookieSerializer.setMaxAge(-1); // 세션 종료 시 쿠키 삭제
                }
            };
        }
    }

     

     

    위의 설정은 기본적으로 세션 쿠키가 생성되지 않도록 하는 설정입니다. 또한 application.properties 파일에서 세션 관리를 설정할 수도 있습니다.

    2. 세션 생성 방지

    Spring Boot의 보안 설정을 통해 세션을 생성하지 않도록 구성할 수 있습니다. 아래 예제는 보안 설정에서 세션 관리를 비활성화하는 방법을 보여줍니다.

     

    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션 생성 방지
                    .and()
                .csrf().disable() // CSRF 보호 비활성화 (필요에 따라 설정)
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .httpBasic(); // 기본 인증 방식 사용
        }
    }

     

     

     

    728x90
    반응형
Designed by Tistory.