본문 바로가기

SPRING SECURITY

[SpringSecurity] 인증부가기능(WebAuthenticationDetails, WebAuthenticationDetailsSource)

인증 부가기능이란?

SpringSecurity에서 보통 ID와 PASSWORD를 이용하여 로그인 처리를 합니다.

 

하지만 ID, PASSWORD 이외에도 추가로 파라미터를 전달하여 인증과정 속에서 활용하거나 인증 이후에도 이 정보들을 참조하여 사용자가 서버에 접근할 수 있도록 하고 싶다면 이러한 방법이 있습니다.

 

WebAuthenticationDetails, WebAuthenticationDetailsSource

 

이 두 개의 클래스에 의해 파라미터를 추가할 수 있는데, 이 것의 흐름은 이렇습니다.

1. 사용자가 ID와 PASSWORD 그리고 PARAM1과 PARAM2를 입력하여 전송합니다.

2. 이 request 객체는 AuthenticationFilter를 통해 Authentication 인증 객체를 만듭니다.

3. 인증 객체를 만드는 과정에서 Object타입인 details에 remoteAddress와 sessionId 그리고 파라미터들을 저장합니다.

4. 이때 details는 WebAuthenticationDetails를 이용하여 값을 넣어주고 이 WebAuthenticationDetailsWebAuthenticationDetailsSource가 생성합니다.

 

소스코드로 확인하기

 

UsernamePasswordAuthenticationFilter.java

인증 객체를 만드는 과정에서 setDetails라는 메서드가 있습니다. 


이 메서드는 AuthentcationDetailsSource를 통해 만들어지는 것을 알 수 있습니다.

참고로 details는 Object 타입입니다.


 

AuthenticationDetailsSource의 구현체인 WebAuthenticationDetailsSource는 WebAuthenticationDetails를 반환하는 것을 알 수 있습니다.

 


WebAuthenticationDetails는 remoteAddress와 sessionId를 저장하는 것을 확인할 수 있고, 여기에 추가로 파라미터를 저장하면 됩 것 같습니다.

 

구현하기

로그인을 시도할 때 html 파일에 hidden값으로 key는 secret_key, value는 secret이라는 값을 같이 넘겨줍니다.


우선 AuthenticationDetails와 AuthenticationDetailsSource를 커스텀할 파일을 만들어 줍니다.


public class FormWebAuthenticationDetails extends WebAuthenticationDetails {

    private String secretKey;

    // 사용자가 전달하는 추가적인 파라미터들을 저장하는 클래스
    public FormWebAuthenticationDetails(HttpServletRequest request) {
        super(request);
        secretKey =  request.getParameter("secret_key");
    }

    public String getSecretKey() {
        return secretKey;
    }
}

파일을 만들고 WebAuthentcationDetails를 상속합니다.

파라미터로 넘어올 secretKey 변수를 만들어 주고 저장합니다.


@Component
public class FormAuthenticationDetailSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {

    @Override
    public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
        return new FormWebAuthenticationDetails(context);
    }
}

마찬가지로, 파일을 만들고 AuthenticationDetailsSource를 상속 후 위에서 만들었던 FormWebAuthenticationDetails를 반환하도록 합니다.


마지막으로 빈으로 등록한 FormAuthenticationDetailSource파일을 가져와 Config클래스에 추가합니다.

 

실행하기

로그인 버튼을 누르면 위에서 만들었던 FormWebAuthenticationDetails에서 secretKey변수에 잘 저장이 되어 반환되는 것을 확인할 수 있습니다.

 

추가로, 이것을 사용하는 예를 들자면

로그인을 시도할 때 검증하는 AuthenticationProvider 클래스를 커스터마이징 할 때 사용할 수 있습니다.

 

출처

인프런 - 스프링 시큐리티 (정수원)

 

스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

초급에서 중.고급에 이르기까지 스프링 시큐리티의 기본 개념부터 API 사용법과 내부 아키텍처를 학습하게 되고 이를 바탕으로 실전 프로젝트를 완성해 나감으로써 스프링 시큐리티의 인증과

www.inflearn.com