인증 부가기능이란?
SpringSecurity에서 보통 ID와 PASSWORD를 이용하여 로그인 처리를 합니다.
하지만 ID, PASSWORD 이외에도 추가로 파라미터를 전달하여 인증과정 속에서 활용하거나 인증 이후에도 이 정보들을 참조하여 사용자가 서버에 접근할 수 있도록 하고 싶다면 이러한 방법이 있습니다.
WebAuthenticationDetails, WebAuthenticationDetailsSource
이 두 개의 클래스에 의해 파라미터를 추가할 수 있는데, 이 것의 흐름은 이렇습니다.
1. 사용자가 ID와 PASSWORD 그리고 PARAM1과 PARAM2를 입력하여 전송합니다.
2. 이 request 객체는 AuthenticationFilter를 통해 Authentication 인증 객체를 만듭니다.
3. 인증 객체를 만드는 과정에서 Object타입인 details에 remoteAddress와 sessionId 그리고 파라미터들을 저장합니다.
4. 이때 details는 WebAuthenticationDetails를 이용하여 값을 넣어주고 이 WebAuthenticationDetails는 WebAuthenticationDetailsSource가 생성합니다.
소스코드로 확인하기
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 SECURITY' 카테고리의 다른 글
CSRF란? (0) | 2021.11.09 |
---|---|
[SpringSecurity] 인증성공, 실패 핸들러 (0) | 2021.11.05 |
[Spring Security] UsernamePasswordAuthenticationFilter에 대해서 (0) | 2021.02.27 |
[Spring Security] Form Login 인증에 대해서 (0) | 2021.02.27 |
[Spring Security] 스프링 시큐리티 시작 (0) | 2021.02.27 |