HttpRequest의 cookieOrigin 필드 관련 질문 #1028
Unanswered
Hansanghyun-github
asked this question in
Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
안녕하세요.
ngrinder를 이용해 테스트를 진행하던 도중 일부 스레드의 인증이 실패했던 경험이 있는데, 이와 관련하여 질문이 있습니다.
상황은 다음과 같습니다.
1개의 에이전트, 1개의 프로세스, 100개의 스레드를 통해 100명의 vuser로 테스트를 진행했습니다.
이때 스레드별로 다른 결과를 받기 위해, 100명의 유저가 모두 동일한 OAuth2 인증을 수행했지만, 각기 다른 유저로 인증되었습니다.
(@BeforeThread 블록에서 인증을 수행했습니다)
이때 OAuth2 인증을 수행하는 동안 문제가 발생했습니다.
100개의 스레드(vuser)가 인증을 수행하는데,
이때 일부 스레드에서 인증이 실패했습니다.
로그를 확인한 결과, 인증에 실패한 스레드들은 요청에 쿠키가 포함되지 않았습니다.
이 문제의 원인을 파악하기 위해 HttpRequest 클래스의 쿠키 관련 코드를 확인해 봤습니다.
위 코드를 보면,
HttpRequest
클래스는COOKIE_STORE
필드를 스레드 로컬로 관리하고 있지만cookieOrigin
필드은 스레드 로컬로 관리되고 있지 않는 것을 확인했습니다.그리고
getMatchedCookies()
메서드는 vuser가 HTTP 요청을 보내기 전COOKIE_STORE
에 저장되어 있는 쿠키들을 요청에 담는 메서드로 보이는데,여기서 현재 스레드의 HTTP 요청으로부터
CookieOrigin
객체를 생성해cookieOrigin
필드를 초기화하는 코드가 문제의 원인으로 보입니다.제가 진행했던 테스트는 OAuth2 인증을 수행하기 때문에
하나의 스레드가 2개 이상의 호스트에 요청을 보냅니다.
이때 여러 스레드가 동시에 다른 호스트에 대해 HTTP 요청을 보내면
cookieOrigin
필드에 대한 레이스 컨디션이 발생해일부 스레드의 HTTP 요청에 쿠키가 담기지 않는 것으로 생각됩니다.
위 문제가 발생한 이유를 정리하면,
여러 스레드가 동일한 HttpRequest 객체를 사용해 각기 다른 호스트로 동시에 요청을 보냈을 때
HttpRequest
객체에서cookieOrigin
필드의 레이스 컨디션으로 인해쿠키가 HTTP 요청에 담기지 않아 인증에 실패한 것으로 보입니다.
저는 이 문제를
CountDownLatch
같은 스레드 동기화 도구를 사용해 각각의 스레드가 동일한 시점에 항상 같은 호스트에 요청을 보내도록 설정하거나, (1)HttpRequest
객체를 두 개 사용해 하나의HttpRequest
객체가 항상 같은 호스트만 요청하도록 설정하는 방법을 (2)이용해 해결했습니다.
이 문제를 해결하면서 드는 질문들은 다음과 같습니다.
cookieOrigin
필드도COOKIE_STORE
필드처럼 스레드 로컬로 관리되는 것이 맞는 것일까요?HttpRequest
객체는 하나의 호스트만 요청하는 것을 가정하고 설계된 것인가요?그래서
cookieOrigin
필드는 스레드 로컬로 관리되지 않는 것인가요?Beta Was this translation helpful? Give feedback.
All reactions