[인프런 강의] 스프링 부트 개념과 활용 - 11

2020. 6. 22. 15:35강의/스프링 부트 개념과 활용

이번 정리부터는 스프링 시큐리티에 대한 정리이다.

스프링 데이터 파트에서 Redis 및 MongoDB의 내용들은

개인적으로 아직 docker를 활용하는데 익숙하지 않기 때문에 뒤로 미루었다. 

docker를 이용해 툴 설치에 익숙해지면 바로 정리해 보아야겠다.

 

1. addViewControllers

컨트롤러에서 어떤 맵핑된 주소에 대하여 view를 내어주는 것 외에 다른 작업을 하지 않을 때는 addViewControllers를 사용할 수 있다. 

 

 

 

이렇게 하면 컨트롤러에 GetMapping을 해주지 않아도 /hello요청이 왔을 때 hello라는 이름을 가진 view를 내어준다.

하지만 컨트롤러에서 다른 로직이 추가될 경우 컨트롤러에서 GetMapping을 사용하여 작업해야 한다.

 

2. 스프링 시큐리티 적용하기 위한 페이지 만들기

이렇게 구조를 만들고 애플리케이션을 실행하면 어떤 결과가 나타날지 누구나 예상할 수 있을 것이다. 

이에 대한 테스트 코드는 다음과 같이 작성하였다. (간단하지만 테스트 코드를 반복적으로 작성하는 연습을 하는 것이 좋은 것 같다.)

 

3. spring-security

2번까지 진행을 했다면 아무런 문제 없이 테스트가 통과하고, 애플리케이션이 잘 작동하는 것을 볼 수 있다. 

하지만 spring-security 의존성을 추가한 후, 테스트를 진행하면 통과하지 못하는 것을 볼 수 있다.

이것은 스프링 부트가 제공하는 시큐리티 자동 설정 때문에 모든 요청에 대해 인증을 필요로 하게 됐기 때문이다. 

애플리케이션을 실행하고 localhost:8080을 요청하면 자동으로 localhost:8080/login페이지로 가는 것을 볼 수 있다.

이것은 스프링 부트 시큐리티 자동 설정이 제공해주는 페이지인데, 요청한 페이지에 대한 인증정보가 없기 때문에 로그인 폼 페이지로 이동시킨 것이다.

스프링 부트 시큐리티에서는 해당 인증정보를 하나 제공해주는데, 기본적으로 username은 user이고 패스워드는 매번 다르게 제공해준다. 이 인증정보를 이용하여 접속하면 애플리케이션이 잘 작동하는 것을 볼 수 있다.

 

4. 시큐리티 커스터마이징

스프링 부트가 시큐리티에 관하여 제공하는 기본 설정에는 userDetails설정이 있다.

따로 설정이 없으면 user를 하나 만들어 제공해주지만, 커스터마이징을 통해 사용자가 유저를 생성할 수 있다.

이를 통해 위에서 만든 페이지 중, my페이지만 인증을 사용하도록 만들 수 있다. 

 

이렇게 WebSecuirityConfigurerAdapter를 확장한 설정 파일을 만들면, 더 이상 기본적으로 제공하던 시큐리티 관련 설정들이 적용이 되지 않는다. 이곳에 커스터마이징 하여 시큐리티 기능을 사용하면 된다. 

configure메서드를 오버라이드 하여, 루트와 /hello요청에 대해서는 접근을 허락하도록 커스터마이징 하였다. 이렇게 하면 /my요청에만 인증정보를 요구하고 나머지 페이지는 인증없이 접속되는 것을 확인할 수 있다.

 

5. 인증정보 설정

4번을 통해서 원하는 페이지만 인증을 요구하도록 만들었지만, 인증을 위해 사용되는 username과 password는 아직 스프링 부트가 자동으로 제공해주는 정보를 사용하고 있다. 우리가 정한 정보를 통해 인증할 수 있도록 만들어 보자.

 

1) JPA사용을 위한 설정들을 해준다. (이전 정리에서 다루었음)

2) AccountService 코드 작성

먼저, 계정을 생성하는 creatAccount 메소드를 만든다.

이후에, UserDeatilsService 설정을 해준다. 이것을 implements해준 타입의 서비스가 있어야 자동으로 생성해주던 계정을 더 이상 만들지 않게 된다. UserDetailsService를 implements 해주면 loadUserByUsername 메서드를 생성하는데, 이것은 인증정보로 입력받은 id가 넘어와서, 해당 id에 맞는 password를 입력했는지 비교하여 인증 성공 여부를 판단해준다. 

 

 

3) createAccount

runner를 이용하여 account를 하나 생성한다. 

 

4) PasswordEncode 설정 및 사용

위에서 사용된 계정을 통해 인증을 시도하면 아래와 같은 오류가 발생하는 것을 볼 수 있다.

스프링 시큐리티 버전이 올라가면서 위와 같은 encoding 문제가 발생한다고 하는데, 이를 해결하는 방법이 생각보다 복잡했다. 결론부터 말하자면 그냥 권장하는 encoding 설정을 해주면 된다.

위와 같이 password를 설정할 때 passwordEncoder를 통해 해 주면, 오류 없이 인증에 성공하는 것을 볼 수 있다.