스프링 Security 연습 1

2018. 3. 14. 16:34공부/SPRING

스프링 Security 연습 1




이왕 스프링부트를 하는 김에, 그동안 Interceptor를 써왔었는데, 스프링 Security 를 사용해보기로 합니다.



#1. build.gradle 에 spring-boot-starter-security 추가하고, Refresh Gradle Project

     ( 리프레시 안하면 에러납니다. )




#2. 스프링부트 어플리케이션을 실행시켜봅니다.

     원래는 아래와 같이 나와야 하는데. ( 시큐리티 적용이 안 되어 있다면 )



    실행 시 로그에 아래와 같은 로그가 추가되면서



    같은 URL을 접속했을 때, 인증 필요라고 나옵니다.




#3. SecurityConfig.java 를 작성합니다.


     

    다시 localhost:8080/hello 를 접속하면, 이번에는 localhost:8080/login 으로 redirect 됩니다.

    아래 login 화면은 만들지 않았고, 스프링에서 기본적으로 튀어나온 녀석입니다.



    user 에 user, password 에는 실행 시, 로그에 찍혀 나온 패스워드를 넣습니다. ( like this : a0b3da48-33d4-4e15-8030-cb58a7cd80cb)



#4. SecurityConfig.java를 계속 작성하고 돌려봅니다.

     WebSecurityConfigurerAdapter의 코드를 보고, 나름대로 수정해가면서 웹 페이지의 변화를 살펴봅니다.

     아직 잘 모르겠습니다.. ㅠㅠ





#5. Member.java 엔티티를 수정합니다.

email 대신에 username, pw 대신에 password 로 필드명을 변경했습니다.

(스프링에서 제공하는 로그인 폼이 username 과 password를 파라미터로 사용합니다.)





#6. org.springframework.security.core.userdetails.User 를 상속받은 LoggedUser를 만듧니다.

클래스 이름은 마음대로 만들어도 됩니다.

다만 super(..) 로 전달되는 3개의 파라미터 중 하나라도 null 일 경우 cannot pass null or empty values to constructor 오류가 발생하므로 주의합니다.





#7. org.springframework.security.core.userdetails.UserDetailsService 의 구현체를 만듧니다.

loadUserByUsername() 함수만 구현하면 됩니다.

파라미터 이름이 email로 된 것은, 오류를 많이 만나다 보니 파라미터 이름 수정이 부족한 탓입니다.





#8. JPA TEST에서 만들어 두었던 MemberRepository.java에 findOneByUsername을 추가합니다.

한 개의 결과를 찾아오는 것이니 username은 unique해야겠군요.





#9. MemberService.java 도 생성해줍니다.

getMember()는 로그인 시에 사용할 것이고,

createMember()는 회원가입 시에 사용할 것이군요.

Role은 여기서 다루는 주제가 아니라서, 그냥 USER로 세팅합니다.

패스워드는 BCryptPasswordEncoder를 사용합니다.





#10. 컨트롤러에 화면 및 회원가입 처리를 추가합니다.

/login 은 일단 스프링에서 제공하는 화면을 쓰기로 하고 주석처리합니다.

/join 은 회원가입 화면입니다. ( 굳이 html 까지 캡쳐는 못합니다 ㅠㅠ )

/process/join 은 실제로 회원가입을 시키고 / 로 리다이렉트 합니다.





#11. SecurityConfig.java 를 수정합니다.

/join, /process/join 은 회원 가입을 위해 모두에게 허용합니다.

/jpa/** 도 회원가입 후 데이터가 잘 있는지 보기 위해 모두에게 허용합니다.

default로 적용되는 것들이 많아서 이 부분은 더 자세하게 봐야 할 듯 합니다.

configureGlobal 의 AuthenticationManagerBuilder 에서 localUserDetailService ( LoggedUserService )를 사용합니다.

패스워드 인코더는 passwordEncoder() 메쏘드를 변경해서 바꿀 수 있으며, 이를 바꾸면 회원 가입 시에 사용한 인코딩 방법도 같은 방법으로 적용해야 합니다. (#9 참조)





#12. /join 으로 가서 회원정보를 등록하고, /login 으로 가서 로그인 테스트가 가능합니다.

기본적으로 구글 검색을 통해 많이 나오는 내용이라, 기본적인 부분은 크게 어렵지 않습니다.

하지만, 커스터마이징 하면서 에러를 만날 경우, 원인을 파악하기 어려운 점이 있었습니다.

로그인 성공 / 실패 후에 스프링으로부터 흐름 처리를 빼앗아 와서 원하는 흐름으로 진행시킬 수 있도록 변경이 필요합니다.