https://spring.io/projects/spring-security
Spring Security
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. Spring Security is a framework that focuses on providing both authentication and authoriz
spring.io
1. 사용자 정의가 가능한 인증 및 액세스 제어 프레임워크이다.
2. 자바 애플리케이션에 인증과 인가를 제공하는 데 중점을 둔 프레임워크이다.
3. Spring Security의 진정한 장점은 사용자 정의 요구 사항을 충족하기 위해 얼마나 쉽게 확장할 수 있는지에 있다.
공식 홈페이지에 있는 정의를 구글 번역기로 돌려보았다... 무슨 말인지 모르겠으니 Spring Security에 대해 다룬 블로그 포스팅들과 여러 가지 레퍼런스를 통해 알아가 보자.
1. 사전 개념
군인 면회를 가본적이 있는가? 군복무를 하고 있는 지인을 만나기 위해서는 군부대 앞 위병소에서 신원을 입증해야 한다.
(군대 이야기를 왜 꺼냐면 내가 공부한 인증과 인가에 대해 쉽게 설명하려니 이 생각밖에 안 든다... 좀 극단적이지만 예를 들어보겠다.)
김병장 : "어떻게 오셨습니까?"
민간인: "최OO 일병 면회 왔습니다. 금일 13시에 면회 일정 잡았다고 하네요~ (신분증을 내밀며) 여기 신분증이요."
김병장 : "면회 리스트 확인 해보겠습니다. 잠시만 기다려주십시오... 신원 확인 되었습니다. 면회장은 우측에 있습니다."
민간인은 본인의 신원을 인증(Authentication)하고 면회장으로 입장할 수 있었다. 다른 예를 들어보겠다.
김병장 : "어떻게 오셨습니까?"
민간인 : "박OO 병장 면회 왔습니다. 일정은 따로 안 잡았는데 입장할 수 있나요?"
김병장 : "사전예약 없이 군부대 방문은 허가하지 않습니다. 돌아가주시기 바랍니다."
허가되지 않은 인원은 면회장에 입장할 수 없는 상황이다. 이것이 인가(Authorization) 이다.
1-1. 필터
Spring Security는 필터 기반으로 동작하기 때문에 Spring MVC와 분리되어 관리 및 동작한다. 아래 그림을 보면 필터는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 요청을 받지만, Interceptor는 Dipatcher와 Controller 사이에만 위치한다. 그래서 이 둘은 적용 시점에 차이가 있다.
필터는 클라이언트와 자원 사이에서 요청과 응답 정보를 이용해 다양한 처리를 한다. 어떤 필터는 요청을 받은 후 클라이언트가 요청한 자원이 아닌 다른 자원으로 리다이렉트 할 수도 있고, 다음 필터에게 요청과 응답을 전달하지 않고 클라이언트에게 바로 응답하기도 한다. 이처럼 Spring Security는 다양한 기능을 가진 필터들을 10개 이상 기본적으로 제공한다. 이를 필터체인이라고 하며 체인처럼 엮여있기 때문에 필터 체인이라고 한다. 모든 요청은 이 필터 체인을 반드시 거쳐야 한다. 필자는 필터에 대해 자세하게 설명해 둔 블로그를 참고했다.
1-2. 용어
- 접근 주체 (Principal) : 보호된 대상에 접근하는 유저
- 인증 (Authentication): 유저가 누구인지 확인(증명)하는 행위
- 인가 (Authorization): 유저에 대한 권한을 확인(허락)하는 행위
1-3. 인증 방식
Spring Security는 세션 - 쿠키 방식으로 인증한다.
1. 유저가 로그인 정보를 입력하면 HTTPServletRequest에 정보가 전달된다. 이때 AuthenticationFilter가 넘어온 정보의 유효성 검사를 진행한다.
2. 유효성 검사 후 실 구현체인 UsernamePasswordAuthenticationToken을 생성하여 전달한다.
3. 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 전달한다.
4. UsernamePasswordAuthenticationToken을 AuthenticationProvider에게 전달한다.
5. 사용자 아이디를 UserDetailService로 전달한다. UserDetailService는 사용자 아이디로 찾은 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.
6. DB에 있는 사용자의 정보를 가져온다.
7. 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 진행한다.
8~10. 인증이 완료되면 SecuritycontextHolder에 Authentication을 저장하고 인증 성공 여부에 따라 핸들러를 실행한다. (AuthenticationSuccessHandler, AuthenticationFailureHandler)
처음 보는 용어도 많고.... 필터의 개수도 많고 이름도 엄청 길어서 주니어 개발자로서 접근 자체가 쉽지 않다ㅋㅋㅋ... 그래도! Spring Security 3.2부터는 XML로 설정하지 않고 자바 Config 설정으로 간단하게 설정할 수 있다고 하니 참고하여 프로젝트에 적용시키면서 한번 더 공부해야겠다.
참고자료
1. 이번 생은 처음이라
2.devdo.log
3.dh1010a.log