본문 바로가기

패스트캠퍼스/100% 환급 챌린지_2

패스트캠퍼스 환급챌린지 9일차 : Netplix 구독형 멤버십 프로젝트로 배우는 Spring Security 강의 후기

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

 

 

안녕하세요 :)

오늘은 챌린지 9일차로, 점식식사 후 커피 한잔의 여유를 가진 후 조금 졸립지만 공부를 하러 왔습니다.

 

오늘 배울 내용은,

Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초

Ch 2. 스프링 시큐리티 기초

"03. 기본 구성 재정의 " 입니다.


 

지난 시간에는 스프링 시큐리티의 기본 설정에 대해 알아봤는데, 이번 시간에는 기본 설정의 값을 재정의하는 방법에 대해 알아보았다. 크게 2가지로 살펴보았는데, UserDetailsService 와 PasswordEncoder 이다.

InMemoryUserDetailsManager 구현체를 이용하여 UserDetailsService 기본 구성을 재정의하는 방법으로, 스프링 빈으로 등록할 수 있다.

 

순서는 다음과 같다.

1. config 패키지를 생성하고 설정 클래스(SecurityConfig) 생성한다.
2. @Configuration 어노테이션으로 클래스를 구성 클래스로 구분한다.
3. @Bean 어노테이션으로 반환되는 값을 스프링 컨텍스트에 반영한다.
4. InMemoryUserDetailsManager 를 UserDetailsService 로 반영한다.

이와 같이 설정 후 로컬에서 애플리케이션을 실행시켜보면 더 이상 비밀번호가 노출되지 않는 것을 확인할 수 있다. 별도의 설정이 없을 때는 스프링 시큐리티 기본 비밀번호로 사용할 수 있는 UUID 가 노출되었었다.

그렇다면 왜 비밀번호가 노출되지 않을까? 기본으로 구성된 UserDetailsService 구현체 대신 스프링 컨텍스트에 반영된 UserDetailsService, 즉 InMemoryUserDetailsManager 를 이용하기 때문이다. 하지만 사용자와 PasswordEncoder 를 적용하지 않았기 때문에 REST 엔드포인트에 접근이 불가능하다. 포스트맨으로 호출을 시도해보면 401 Unauthorized 에러가 발생한다.

로컬 환경인 포스트맨에서 테스트를 해서 아이디와 패스워드로 호출하면 여전히 401 Unauthorized 에러가 발생하는 것을 알 수 있다. 


왜 그럴까? 로컬 애플리케이션에서 다음과 같은 에러 로그가 발생한다.
"You have entered a password with no PasswordEncoder."
→ REST 엔드포인트를 호출할 때 스프링 시큐리티가 암호를 관리하는 방법을 모르기 때문에 오류가 발생한다. 그래서 어떤 식으로 암호를 인코딩을 하고 디코딩을 해야 되는지 패스워드 인코더에 대한 구현체가 정의되지 않았기 때문에 이러한 에러가 발생한다고 보면 된다고 이해할 수 있다.