• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

쓰레드 생명 주기?

22.11.09 14:36 작성 조회수 349

0

안녕하세요.

강사님의 시큐리티 강의를 재밌게 듣고 있는 수강생입니다.

이게 맞게 질문드리는건진 모르겠는데,

쓰레드 로컬의 생명주기는 어떻게 되는걸까요? 몇가지 질문을 드리자면..

  1. 제가 스프링을 학습해보면서 사용자가 서버에 접속하면 서블릿 컨테이너의 쓰레드 풀에서 쓰레드 하나를 할당받아 사용하는 걸로 알고 있는데, 시큐리티에서 사용되는 쓰레드가 풀에서 받은 쓰레드랑 동일한 것일까요?

  2. 클라이언트는 인증이 완료되고, DispatcherServlet까지 거쳐 정상적인 응답을 받으면 쓰레드를 반환하지 않는지요? 쓰레드를 반환하면 컨텍스트 정보가 다 날라갈 것이라 생각했는데, 시간 지나도 로그인 유지가 잘 되는거 같아 의아합니다.

  3. 톰캣의 쓰레드 풀 설정을 보통 몇십개에서 몇백개 사이로 하던데, 동시 접속자 수가 많아져 쓰레드 개수가 부족하면 인증 정보가 SecurityContext에 어떻게 관리될지가 궁금합니다.

제가 아는 정보가 좀 짬뽕되어 맞게 질문드리는 건진 모르겠으니 강사님의 소중한 고견 좀 부탁드리겠습니다. 감사합니다!

 

답변 1

답변을 작성해보세요.

5

  1. 제가 스프링을 학습해보면서 사용자가 서버에 접속하면 서블릿 컨테이너의 쓰레드 풀에서 쓰레드 하나를 할당받아 사용하는 걸로 알고 있는데, 시큐리티에서 사용되는 쓰레드가 풀에서 받은 쓰레드랑 동일한 것일까요?

네 동일한 스레드가 맞습니다.
스레드는 보통 WAS 에서 생성되어 요청을 처리하게 되는데 시큐리티도 스레드의 요청을 받아서 인증 및 인가처리를 하기 때문에 동일한 스레드 안에서 진행됩니다.

  1. 클라이언트는 인증이 완료되고, DispatcherServlet까지 거쳐 정상적인 응답을 받으면 쓰레드를 반환하지 않는지요? 쓰레드를 반환하면 컨텍스트 정보가 다 날라갈 것이라 생각했는데, 시간 지나도 로그인 유지가 잘 되는거 같아 의아합니다.

네 컨텍스트 정보는 삭제되는 것이 맞습니다
다만 삭제 되기 전에 세션에 저장하는 과정이 있습니다. 그래서 클라이언트가 재 접속을 하더라도 세션이 살아 있으면 세션안에서 컨텍스트 정보를 꺼내어 재사용하기 때문에 계속 인증상태가 유지가 되는 구조로 되어 있습니다.

 

  1. 톰캣의 쓰레드 풀 설정을 보통 몇십개에서 몇백개 사이로 하던데, 동시 접속자 수가 많아져 쓰레드 개수가 부족하면 인증 정보가 SecurityContext에 어떻게 관리될지가 궁금합니다.

    SecurityContext 는 스레드별로 독립적으로 제어가 되기 때문에 스레드의 개수와는 상관이 없습니다.
    만약 스레드 개수가 많아져서 더 이상 서버에서 처리가 불가능 하거나 스레드가 사용가능 할 때까지 대기하는 상황이 발생한다면 시큐리티도 더 이상 요청을 받을 수 없게 되고 현재 진행 중인 요청만을 처리하게 됩니다.
    물론 대기 상태가 다시 해제되어 스레드가 가용이 된다면 시큐리티가 요청을 다시 받아 SecurityContext 에 인증정보를 담는 처리를 하게 됩니다.
    즉 스레드의 일정양을 초과하는 수는 리소스 자원을 크게 소모하기 때문에 메모리 부족으로 인한 어플리케이션이 죽거나 요청을 받지 못하는 상태로 인해 네트워크 오류 등으로 문제가 발생하는 부분이지 시큐리티의 직접적인 내부 흐름과는 상관이 없습니다. 결국 시큐리티도 어플리케이션이 죽으면 아무런 의미가 없는 거라 할 수 있습니다.

초보자님의 프로필

초보자

질문자

2022.11.15

우와 정말 친절한 답변 감사드립니다! 조금씩 개념이 머릿속에 잡히는 기분입니다!

세션 덕분에 다시 인증이 가능하게끔 되는건구요!

세션에 대해 약간 궁금한 것이

  1. 찾아보니 쿠키는 제한 용량이 4kb이고 세션은 제한이 없지만 보통 128mb까지 된다고 봤습니다. 128mb까지 쓸일은 없을거라 생각되오나 동시 접속자 정말 많이 왔다갔다 하는 서비스에서는 많은 세션? 용량?으로 인해 서비스가 다운되는 경우도 있을까요? 아니면 수원님께서 이런 이슈로 장애를 겪어보신 사례가 있으실까요?

  2. JWT로 로그인하려는 상황에서는 보통 Session STATELESS 정책을 쓴다고 들었습니다. 어차피 JWT 토큰으로 매 인가를 처리하기 때문에 세션이 필요없어서 안 쓰는 것일까요?

  3. 현재 팀프로젝트를 하면서 안드로이드랑 하려고 하는데 보통 이런 경우에도 세션을 안 쓰고 JWT로 인증/인가를 많이 하는 것일까요?

 

다시 한 번 친절한 답변 정말 감사드립니다! ㅎㅎ