로그인 요청 시 jvm은 어떤 일을 하는가

로그인 요청시 JVM은 어떤 일이 발생하는가?

스택/힙/메서드 영역 관점에서 “요청이 들어왔을 때” 흐름을 이해해보자

핵심 요약

로그인 요청이 들어오면, 웹서버가 요청을 받고 JVM 위에서 실행 중인 자바 코드(서블릿/필터/컨트롤러/서비스)가 인증 로직을 수행합니다. 이 과정에서 스택에는 메서드 호출 정보가 쌓였다가 사라지고, 에는 DTO/객체/결과 등이 생성되며, 메서드 영역에는 클래스 메타데이터가 재사용됩니다.

1) 서버가 “로그인 요청 처리”를 시작할 때

  • 사용자가 로그인 폼을 제출하면 브라우저가 HTTP 요청을 보냅니다.
  • 서버(예: 톰캣/넷티)가 요청을 받아 자바 쪽으로 전달합니다.
  • 이미 서버 프로세스가 실행 중이라면 JVM도 이미 떠 있는 상태이고, 로그인 요청 처리에 필요한 클래스/코드가 실행 흐름을 타기 시작합니다.

(서버가 “부팅될 때” JVM이 크게 준비하는 작업도 있지만, 여기서는 로그인 “요청” 순간에 초점을 둡니다.)

2) JVM 메모리 관점: 요청 처리 중에는 무엇이 일어나나?

스택(Stack): 호출 흐름이 임시로 쌓인다

로그인 요청을 처리하는 동안 컨트롤러 → 서비스 → 리포지토리(DAO) 같은 메서드가 연달아 호출됩니다. 이때 각 메서드가 끝날 때까지 필요한 정보(지역변수, 호출 관계 등)가 스택 프레임 형태로 쌓였다가, 메서드가 종료되면 다시 사라집니다.

힙(Heap): 요청 관련 객체들이 만들어졌다가 정리될 수 있다

로그인 요청에 들어온 값(아이디/비밀번호), 인증 결과, 조회해온 사용자 정보(User 객체), 토큰/세션 관련 객체 등이 대개 에 만들어집니다. 이후 응답이 끝나고 더 이상 참조되지 않으면, GC가 청소 대상으로 삼게 됩니다.

메서드 영역(Method Area) / Metaspace: 클래스 정보는 재사용된다

인증에 쓰이는 클래스들이 이미 로딩되어 있다면(서버가 올라오며 대부분 준비됨), 요청 처리 중에는 메서드/클래스 메타정보를 재사용합니다.

PC(Program Counter): “다음에 실행할 위치”를 따라간다

JVM(정확히는 스레드)이 실행하는 코드의 “다음 위치”를 추적하는 개념이 있습니다. 조건문/메서드 호출이 발생할 때 분기와 흐름이 그 위치 추적을 따라갑니다.

3) “어떻게 코딩해야 하나?” 로그인 구현의 기본 구조

프레임워크/설계에 따라 세부는 달라도, 일반적으로는 책임을 나눕니다.

  • Controller: 요청을 받고 입력을 받는다(검증 포함)
  • Service: 인증 로직을 수행한다(업무 흐름)
  • Repository/DAO: 사용자 정보를 DB에서 조회한다
  • Password 처리: 평문을 비교하지 않고 해시 검증만 한다
중요: 비밀번호는 절대로 평문으로 저장하면 안 됩니다.
보통 BCrypt 같은 해시 알고리즘으로 저장하고, 로그인 시에는 “입력 비번 → 해시 검증”을 수행합니다.

아래는 스프링 스타일의 “구조 예시(개념 코드)”입니다.

// 입력 모델
record LoginRequest(String username, String password) {}

// 서비스 로직 뼈대(개념 예시)
class AuthService {
  private final UserRepository userRepository;
  private final PasswordHasher hasher; // 예: BCrypt

  AuthService(UserRepository userRepository, PasswordHasher hasher) {
    this.userRepository = userRepository;
    this.hasher = hasher;
  }

  LoginResult login(LoginRequest req) {
    var user = userRepository.findByUsername(req.username())
        .orElseThrow(() -> new AuthException("invalid credentials"));

    // 비밀번호는 "저장된 해시"와 "입력 비밀번호"를 해시 검증으로 비교
    if (!hasher.matches(req.password(), user.getPasswordHash())) {
      throw new AuthException("invalid credentials");
    }

    // 성공 시: 세션 발급 또는 JWT 생성 같은 결과 만들기
    return new LoginResult(/* token or session info */);
  }
}

4) 로그인 성공/실패 후 JVM은 어떻게 끝나나?

  • 성공하면 세션을 만들거나(JSESSIONID 등) JWT를 생성해 응답 헤더/쿠키로 돌려줍니다.
  • 실패하면 401 같은 상태 코드로 에러 응답을 반환합니다.
  • 요청을 처리하던 스레드의 스택은 대부분 정리되고, 힙에는 “응답/세션/토큰 등 의도한 결과”만 남는 형태가 됩니다.

5) 한 줄 결론

로그인 요청 “순간”의 JVM은 스택에 호출을 쌓아 인증 흐름을 실행하고, 힙에 요청 관련 객체를 만들며, 메서드 영역의 클래스 정보를 재사용해서 결과(세션/JWT/응답)를 생성합니다.

다음 단계(선택)

네 환경이 Spring Security + 세션인지, JWT 토큰인지에 따라 “로그인 성공 시 무엇을 발급하고 어디에 저장되는지” 코드를 더 구체적으로 맞춰줄 수 있어요.



참고: 이 글은 “로그인 요청 처리 과정”을 JVM 메모리 관점(스택/힙/메서드 영역)에서 설명하는 목적의 요약입니다.
다음 이전