본문 바로가기
Projects/쇼핑몰 프로젝트

[JUnit] Spring Security 로그인 테스트

by 젊은오리 2023. 2. 27.
728x90

프로젝트에 Spring Security를 활용하여 로그인을 구현했기 때문에 spring security환경에서의 로그인 테스트가 필요했다.

MockMvc로 테스트 하고자 하여 MockMvc객체에 대해서 공부했다.

 

MockMvc 객체란?

서블릿 컨테이너의 구동 없이, 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸리티 클래스다. 즉, MockMvc객체를 생성하여 사용하면, WAS역할을 대신하기 때문에 Tomcat을 구동하지 않고 테스트를 할 수 있다. 

자주 사용하는 메서드

  • perform : 요청을 처리한다. 리턴값으로 ResultActions 객체를 받으며, 이 객체는 리턴 값을 검증하고 확인할 수 있는 andExpect()를 제공한다. 
  • andExpect : 응답을 검증한다.
    상태 코드 검증
    응답 내용 검증
    MVC 모델 상태 검증
  • andDo : 결과를 출력한다.

MockMvc 사용법에 대한 자세한 설명은 https://velog.io/@jkijki12/Spring-MockMvc 에서 참고하면 될듯하다.

 

우선 Security설정클래스에는 다음과 같이 /auth/login에서 formLogin을 하고, 로그인에 성공했을 시에 "/"로 redirect하도록  되어 있다.

SecurityConfig.class

@Override
protected void configure(HttpSecurity http) throws Exception {

    //super삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화됨.
    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/user/**","/cart/**","/mypage/**").authenticated()
            .anyRequest().permitAll()
            .and()
        .formLogin()
            .loginPage("/auth/login")
            .loginProcessingUrl("/auth/login")
            .defaultSuccessUrl("/")
        .and()
            .oauth2Login() //oauth2로그인도 추가로 진행
            .userInfoEndpoint() //oauth2로그인 성공 후에 사용자 정보를 바로 가져온다.
            .userService(oAuth2DetailsService);
}

 

로그인 성공 테스트

  • 회원을 만들고, 동일한 username으로 로그인해보았다.
  • 회원가입시에 BCryptPasswordEncoder로 비밀번호를 해쉬 암호화해서 저장하도록 했기 때문에 user.getPassword()로 User의 비밀번호를 불러오면 에러가 뜬다. 따라서 아래 예시와 같이 암호화 되기 전 초기 비밀번호를 formLogin()에 넣어주어야 한다.
  • 인증된 사용자인지(authenticated), 상태코드가 3xx인지(status().is3xxRedirection()), 홈으로 Redirect되는지(redirectedUrl("/))을 확인했다.

로그인 실패 테스트

  • 없는 username으로 로그인 했을 시에 인증되지 않은 사용자로 뜨는지 확인해보았다.(unauthenticated())

 

Test Code

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@AutoConfigureMockMvc
public class 로그인 {
    @Autowired
    MockMvc mockMvc;
    @Autowired
    CommonMethod commonMethod;
    @Autowired
    WebApplicationContext context;

    //mockMvc 객체 생성, Spring Security 환경 setup
    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(this.context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void 로그인_성공() throws Exception{
        //회원가입
        User user = commonMethod.createUser("로그인 테스트용_ID");

        String username = "로그인 테스트용_ID";
        String password = "123";

        mockMvc.perform(formLogin("/auth/login").user(username).password(password))
                .andDo(print())

                .andExpect(authenticated())
                .andExpect(status().is3xxRedirection())
                .andExpect(redirectedUrl("/"));
    }

    @Test
    public void 로그인_실패() throws Exception{
        String username = "존재하지 않는 아이디";
        String password = "123";

        mockMvc.perform(formLogin("/auth/login").user(username).password(password))
                .andExpect(unauthenticated());
    }
}

 

테스트 결과 모두 파란불이 떴당

728x90

댓글