본문 바로가기
Network Study

로그인(Authentication) - 쿠키(Cookie), 세션(Session)

by xogns93 2024. 10. 10.

로그인(Authentication)쿠키(Cookie), 세션(Session) 개념은 웹 애플리케이션에서 사용자 인증 및 상태 유지를 위한 중요한 요소들입니다. 각각의 개념을 이해하면 웹 애플리케이션에서 사용자의 로그인 상태를 어떻게 유지하는지, 클라이언트와 서버 간의 데이터를 어떻게 관리하는지 알 수 있습니다.

1. 로그인(Authentication)

인증(Authentication)은 사용자가 누구인지 확인하는 과정입니다. 웹 애플리케이션에서는 사용자가 아이디와 비밀번호를 입력하여 로그인하면, 서버는 이 정보가 유효한지 확인합니다. 인증이 성공하면, 사용자는 애플리케이션에 접근할 수 있는 권한을 얻게 됩니다.

인증(Authentication)의 주요 단계:

  1. 사용자 정보 입력: 사용자가 아이디와 비밀번호 같은 로그인 정보를 입력합니다.
  2. 서버에서 인증 확인: 서버는 데이터베이스에서 해당 사용자가 존재하는지, 비밀번호가 맞는지 확인합니다.
  3. 인증 성공 시 세션 또는 토큰 생성: 인증이 성공하면, 서버는 사용자의 상태를 유지하기 위해 세션 또는 토큰을 생성합니다.
  4. 클라이언트에 세션 ID 또는 토큰 전달: 세션 ID나 토큰을 쿠키 또는 헤더를 통해 클라이언트에 전달하여, 이후 요청에서도 인증된 사용자인지 확인할 수 있게 합니다.

2. 쿠키(Cookie)와 세션(Session)의 차이

쿠키와 세션은 모두 클라이언트와 서버 간의 상태를 유지하기 위한 방법입니다. 그러나 이 둘은 관리되는 위치와 방식이 다릅니다.

쿠키(Cookie)

  • 클라이언트 측에 저장되는 데이터입니다.
  • 쿠키는 작은 데이터(키-값 쌍)로, 사용자의 브라우저에 저장되며, HTTP 요청이 있을 때마다 자동으로 서버에 전송됩니다.
  • 쿠키는 브라우저가 종료되어도 설정된 만료 시간에 따라 데이터를 유지할 수 있습니다.
  • 클라이언트가 직접 쿠키를 조작할 수 있으므로 보안에 취약할 수 있으며, 중요한 정보를 쿠키에 저장하는 것은 권장되지 않습니다.

쿠키 사용 예시 (JavaScript):

// 쿠키 생성
document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";

// 쿠키 읽기
console.log(document.cookie);

세션(Session)

  • 서버 측에서 저장되는 데이터입니다.
  • 세션은 각 클라이언트에 대해 고유한 세션 ID를 부여하고, 이 세션 ID를 통해 클라이언트의 상태를 서버에 저장합니다.
  • 클라이언트는 브라우저가 닫힐 때 세션이 만료될 수 있으며, 세션 ID는 주로 쿠키에 저장되어 서버와 통신할 때마다 전송됩니다.
  • 중요한 정보는 서버에서 관리되기 때문에 보안이 더 뛰어납니다.
  • 서버에 세션 데이터가 저장되므로, 서버 메모리데이터베이스에서 관리합니다.

세션 사용 예시 (서블릿):

HttpSession session = request.getSession();  // 세션 가져오기
session.setAttribute("username", "JohnDoe"); // 세션에 데이터 저장
String username = (String) session.getAttribute("username"); // 세션에서 데이터 가져오기

3. 쿠키와 세션의 차이점 요약

항목 쿠키(Cookie) 세션(Session)
저장 위치 클라이언트 측 (브라우저) 서버 측
저장 방식 클라이언트가 직접 수정 가능 서버에 저장, 클라이언트는 세션 ID만 가짐
보안성 상대적으로 낮음 (쿠키 조작 가능) 상대적으로 높음 (서버에서 관리)
유지 기간 만료 시간에 따라 브라우저 종료 후에도 유지 가능 브라우저 종료 시 만료될 수 있음
용량 제한 쿠키 당 4KB 제한 서버 메모리나 데이터베이스에 의해 결정
주 용도 클라이언트에 간단한 데이터 저장 (로그인 유지 등) 로그인 상태 유지 및 사용자 세션 관리

4. 로그인 상태 유지: 세션과 쿠키의 협력

  • 로그인 후 세션 생성: 사용자가 로그인에 성공하면, 서버는 세션을 생성하고 이 세션에 로그인 정보를 저장합니다.
  • 세션 ID를 쿠키에 저장: 서버는 클라이언트에게 세션 ID를 쿠키로 보내고, 클라이언트는 이후 요청을 보낼 때마다 이 쿠키를 서버로 전송합니다.
  • 서버는 세션 ID를 사용해 상태 확인: 서버는 클라이언트가 보낸 세션 ID를 확인하고, 해당 세션에 저장된 로그인 정보를 사용하여 사용자를 인증합니다.

예시 흐름:

  1. 로그인 요청: 사용자가 아이디/비밀번호를 입력하여 서버로 로그인 요청을 보냅니다.
  2. 서버에서 인증 처리: 서버는 사용자의 로그인 정보를 확인하고, 인증에 성공하면 세션을 생성하고 세션 ID를 발급합니다.
  3. 클라이언트에 세션 ID 전달: 서버는 클라이언트에 세션 ID를 쿠키로 전송합니다.
  4. 클라이언트의 추가 요청: 클라이언트는 이후 요청을 보낼 때마다 세션 ID를 쿠키로 포함하여 서버에 보냅니다.
  5. 서버에서 세션 확인: 서버는 해당 세션 ID를 기반으로 클라이언트의 상태를 유지하고, 인증된 사용자로 요청을 처리합니다.

5. 쿠키를 사용한 로그인 상태 유지 (스프링 보안 예시)

스프링에서는 세션쿠키를 통해 로그인 상태를 유지할 수 있으며, 스프링 시큐리티(Spring Security) 프레임워크는 이를 손쉽게 처리합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()  // 기본 로그인 페이지
                .loginPage("/login")
                .defaultSuccessUrl("/home")
            .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login");
    }
}
  • formLogin(): 스프링 시큐리티에서 기본적으로 로그인 폼을 제공하며, 로그인 성공 시 세션을 통해 사용자 정보를 유지합니다.
  • logout(): 로그아웃 처리도 간단히 설정할 수 있으며, 로그아웃 시 세션을 만료시킵니다.

6. 세션과 쿠키의 보안 이슈 및 해결 방안

  1. 세션 하이재킹(Session Hijacking):
    • 공격자가 사용자의 세션 ID를 탈취하여, 그 세션을 통해 서버에 불법적으로 접근하는 공격입니다.
    • 해결 방법: HTTPS를 사용하여 세션 ID가 전송될 때 암호화하고, 세션 타임아웃 설정을 적절하게 관리하는 것이 좋습니다.
  2. 쿠키 조작(Cookie Manipulation):
    • 클라이언트가 쿠키에 저장된 데이터를 조작할 수 있기 때문에, 중요한 정보를 쿠키에 저장하는 것은 위험합니다.
    • 해결 방법: 민감한 정보를 쿠키에 저장하지 않고, 서버 측에서 관리하며, HTTPOnlySecure 속성을 사용하여 쿠키를 보호해야 합니다.

요약

  • 로그인(Authentication)은 사용자가 누구인지 인증하는 과정이며, 인증이 성공하면 서버는 사용자의 로그인 상태를 유지하기 위해 세션 또는 쿠키를 사용합니다.
  • 쿠키는 클라이언트 측에 저장되며, 브라우저가 HTTP 요청 시 자동으로 서버로 전송합니다. 보안에 취약할 수 있으므로 중요한 정보를 저장할 때 주의가 필요합니다.
  • 세션은 서버 측에서 관리되며, 클라이언트에게는 세션 ID만 전달됩니다. 서버는 세션을 통해 사용자의 상태를 유지합니다.
  • 스프링 시큐리티를 사용하면 세션과 쿠키를 쉽게 관리하여 로그인 상태를 유지하고, 보안성을 강화할 수 있습니다.