Back-End/에러와의 전쟁

[Error] - Query parameters with the following names were not documented: [_csrf] 스프링 시큐리티 환경에서 테스트 작업과 Spring rest Doc을 이용한 문서화 작업을 하면 생기는에러

얄루몬 2023. 7. 28. 16:14

[문제 상황]

  • 스프링 시큐리티 환경에서 컨트롤러 레이어의 유닛 테스트 진행에 발생할 수 있는 문제
  • 이 문제는 query string(=query parameter)으로 넘어오는 파라미터에 대해서 발생할 수 있는 상황인듯 싶다.(Pathvariable을 사용했을 땐 이런 일이 없었음)

Query parameters with the following names were not documented: [_csrf]

 

[시큐리티 환경에서의 컨트롤러 레이어 테스트 작업 코드]

  ResultActions perform = mockMvc.perform(get("/api/service/members/loginHistory").param("today", String.valueOf(today))
                .with(csrf())//(1)
                .contentType(MediaType.APPLICATION_JSON));
  • - spring security 환경에서 controller layer 부분을 테스트 하는 작업

(1) 이때 with(csrf())를 사용해서 토큰을 넘겨주어야 해당 컨트롤러 테스트가 진행이 된다. 이를 넘겨주게 되면 spring rest docs를 사용해서 api 문서화 작업을 진행할 때 해당 토큰 역시 파라미터로 넘겨주어야 한다.

 

[문제 해결방안]

Query parameters with the following names were not documented: [_csrf] 발생 시

 

//spring rest docs (api 자동화)
        perform.andDo(document(
                "get-member-by-login-history-one-years-ago-member",
                getDocumentRequest(),
                getDocumentsResponse(),
                queryParameters( //(2) 
                        parameterWithName("today").description("오늘 날짜"),
                        parameterWithName("_csrf").description("스프링 시큐리티 사용시 테스트 작업에 넘겨주는 토큰") //(3)
                ),

(2) 해당 컨트롤러는 pathvariable이 아닌 query string으로 넘겨 받는 작업을 진행하기 때문에 queryParameters라는 메소드를 통해서 쿼리스트링들을 설정해주어야 한다.

(3) 이때 넘겨받는 쿼리스트링들을 하나씩 넣어주고 설명을 달아주는데 우리는 스프링 시큐리티 환경에서 해당 컨트롤러를 테스트하고 있는 작업을 진행하고 있어 csrf를 넘겨주었기 때문에 이 역시 여기에 설정해주면 된다.