본문 바로가기

SpringSecurity

SpringSecurity(Authentication) 인증 부가기능

반응형

사용자가 인증을 요청을 하게되면 AuthenticationFilter 가 인증을 받아서 요청을 처리하게된다 . 이때 사용자가 기본적으로 ID와 Password를 입력 한다 하지만 현재 위엑 그림 상으로는 추가적으로 정보를 전달하고자 파라미터로 전달하는경우다. 

추가적으로 전달된 이정보들을 저장해서 인증과정속에서 활용하거나 인증이후에도 이정보들을 참조해서 사용자가 서버자원에 접근 할수 있도록 한다 WebAuthenticationDetails 이 그역할을 하고 WebAuthenticationDetails를 생성하는 클래스가  AuthenticationDetailsSource이다 

 

앞에사도 계속 언급했듯이 사용자가 이증을 요청하게 되면 Authentication(인증객체) 를 생성한다 여기에는 ID 와 Password가 저장된다. 

Authentication(인증객체)은 내부적으로 Details라는 내부속성을 가지고 있다. Details 속성은 object 타입이라서 어떤 타입이든 저장할수 있는 객체이다. 

 

Details속성에 WebAuthenticationDetails객체를 만들어서 저장한다. 결국은 WebAuthenticationDetails가 사용자가 추가적으로전달하는 파라미터 값들을 얻어서 저장하는 역할을 한다 request라는 객체가 전달되고 request.getParameter("param1") 형식으호 추가적으로 전달되는 정보들을 저장하고 remoteAddress, SessionId 는 스프링 시큐리티에서 기본적으로 처리 하고 이후에 WebAuthenticationDetails객체에 저장한다.

 

간단히 설명하면 Authentication에 사용자의 ID 와 passwrd가 저장되고 내부적으로 Details라는 속성이 있는데 이 속성에는 사용자가 ID와PASSWORD,추가적으로 전달하고자 할때 request객체를 이용해서 파라미터 값들을 저장하는 객체가 WebAuthenticationDetails이다 

그리고 이객체를 생성하는 클래스가 AuthenticationDetailsSource이다. 

 

 

UsernamePasswordAuthenticationFilter.java

인증필터가 지금 인증을 시도할때 토큰을 만들고 setDetails에서 처리과정이 있다 무슨처리를 하는지 살펴보자

 

 

 

인증객체에다가 setDetails  해서 좀더 디테일한 객체와 데이터 정보를 담을수 있다. 위에 설명한 WebAuthenticationDetails 객체를 담을건데 이녀석을 만드는놈이 누구라고? 바로 AuthenticationDetailsSource 클래스가 WebAuthenticationDetails를 만들어주고Details에 담아서 사용자가 username,password이 외에 추가적으로 전달하는 정보를 인증한다.

 

AuthenticationDetailsSource.java

이클래스에서 WebAuthenticationDetails 객체를 만드는걸 확인할수있다 

음 그렇다면! 사용자가 로그인할때 우리가 모르는 사이에 엄청난 많은 일을 할수있다는걸 알수 있다 SpringSecurity는  참고맙게도 알아서 다해준다 사용법을 충분히 익힌다면 정말 쓰임새 있는 녀석이란걸 오늘도 느낀다. 

 

WebAuthenticationDetails.java

 

WebAuthenticationDetails 클래스 보면 기본적으로 제공하는 remoteAddress, sessionId 를 request를 통해서 얻고 있다 

여기서 두개의 데이터가 기본적으로 저장된다 무슨정보가? username,password 가  저장된다. 여기서 사용자가 추가적으로 전달하는 다른 정보들도 request.parameter 로 값들을 전달받을수 있다. 자 그러면 처리 과정을 코딩해보자 

 

 

 

일단 난 패키지 하나를 추가 해줫고 클래스를 2개 만들어줬다 클래스 이름은 하고싶은대로 하면되지만 되도록 한번 보고 바로 알아볼수 있도록 적는게 좋다 지금나도 클래스 이름이 무척이나 길다 이유는 아직 나도 강의를 보면서 공부중이라 일단 똑같이 따라하기로 했다!

 

이클래스는 사용자가 추가적으로 전달하는 정보들을 저장하는 클래스이다. WebAuthenticationDetails 클래스를 상속 받고 하나만 추가 해서 진행하자 secretkey 이라고 정의를 하고  request.getParameter("secret_key") 사용자가 전달하는 정보의 이름을 정해준 이후에 get 메서드를 만들어 주면된다. 그러면 이클래스를 생성하는 클래스를 만들어줘야하지 않겠나? 앞에서 설명했듯이 WebAuthenticationDetails 이클래스는 혼자서 '빵'! 하고 나오는녀석이 아니다

 

 

이클래스가 이제 WebAuthenticationDetails이클래스를 생성하게 되는데 AuthenticationDetailsSource 인터페이스 구현체이다 

이클래스가 WebAuthenticationDetails 타입의 클래스를 생성할수 있도록 메서드를 호출해주고 아까 만들었던 WebAuthenticationDetails클래스와  request객체를 리턴해준다.

그리고 잊지말아야 하는게 이클래스는 설정클래스이기 때문에 @Component 선언해서 빈으로 등록되게 해야한다 

 

 

 

 

 

이클래스는 폼인증 API를 사용하는 클래스이다 저번 포스팅에서 폼인증 할때 사용자의 권한에 으해서 서버자원에 접근이 가능하도록 설정해준 클래스이다. 새로 추가된 api 는  authenticationDetailsSource(authenticationDetailsSource) 위에서 말했듯이 생성해줘야지 Details에서 전달받은 값들을 저장할수 있다고 했다. 여기서 중요한건 구현체를 사용하는것이 아니라 AuthenticationDetailsSource를 사용해주면된다. 게시판 만들때도 직접 구현체를 사용하지 않고 인터페이스를 사용하니까 그 프로세스랑 똑같다고 생각하면 될거 같다.

마지막으로  html 파일에 아까 String 값으로 추가 해줬던 secretkey를 설정해줘야한다

 

 

이전에 만들어줬던 CustomAuthenticationProvider클래스다 현재는 사용자가 전달한 아이디와 패스워드를 인증하고 있다 이제  secretkey키가 있으면 인증에 성공하고 없으면 인증에 실패 하도록 추가해보자. 

(FormWebAuthenticationDetails) authentication.getDetails() 타입으로 데이터를 가지고 와서 전에 get 메서드를 만들어 줬는데 get 메서드를 호출해서 String 값에 저장하고 String 값에 secretkey키값이 널이거나 일차하지 않을때 예외를 발생할수있도록 처리 해주면된다. 

 

 

이제 코딩은 끝낫다 이제 디버깅을 통해서 흐르을 파악해보자

 

 

AuthenticationFilter로 와서 setDetails라는 속성에 값을 저장하게 되는데  자세히보면 아까 만들어줬던 FormAuthenticationDetilasSource가 호출되고 있다.  그리고 위에서 설명했듯이 users , password 는 기본적으로 저장한다고 했다 혹시모르니 확인해봤다.

 

 

내가만들어줬던 FormAuthenticationDetilas를 생성해주고 디버깅을 확인해보면 request객체를 받아오는걸 확인할수 있다 

 

 

현재 secret이라는 값이 전달 받아졌다 오른쪽을 보면 알수 있듯이 secret 키는 현재 reuest 를 통해서 parameter 값으로 받아 오고 있다 

 

 

여기서 secret 값이 없으면 예외를 발생시키고 인증처리가 안되도록 해줬다 확인헤보면 현재는 secret키를 가지고 있기 때문에 false 가확인되고 결국 예외는 발생하지않고 정상적으로  인증처리가 완료된다.

 

 

여기 까지 오는것도 오류가 생겨서 한참을 해맷다 결국 안되서 질문을 남겼다 정말 어처구니 없다 부끄럽다 정말 ㅜ 실수하지 말자 ㅠㅠ

선생님 감사합니다 

반응형