현재 구축한 시스템에서 로그인방식을 추가해야할 일이 있었다.
해당 시스템에서는 사용자가 입력한 아이디와 비밀번호 정보만 받아
스프링 시큐리티에서 인증처리를 하고 있어서,
시스템 상에서 어떤 방식으로 로그인을 할지
로직 분기를 판단하는데 어려움이 있었다.
이를 해결하기 위해 스프링 시큐리티에 대해 좀 더 알아보게 되었다.

스프링 시큐리티에서 로그인 인증 정보의 전달은 Authentication을 통해 이루어진다
Authentication을 살펴보면, 아래 메서드들로 구성된 인터페이스이다.

해당 메서드들이 접근하는 필드들은 아래와 같다
- Principal : 사용자 아이디 혹은 User 객체를 저장
- Credentials : 사용자 비밀번호
- authorities : 인증된 사용자의 권한 목록
- details : 인증 부가 정보
- Authenticated : 인증 여부
details필드에 로그인 방식에 대한 정보를 담아 전달하면 문제를 해결할 수 있다고 판단하였다.
이를 위해 우선 WebAuthenticationDetails 객체를 상속한 커스텀 클래스를 만들었다.
해당 WebAuthenticationDetails 객체는 일종의 VO역할을 하는듯 싶다.
public class 커스텀웹인증디테일즈 extends WebAuthenticationDetails {
private final String 담고자하는_추가정보;
public 커스텀웹인증디테일즈(HttpServletRequest request) {
super(request);
this.담고자하는_추가정보 = request.getParameter("Http요청에서 수신하는 추가정보");
}
public String getter_담고자하는_추가정보() {
return 담고자하는_추가정보;
}
}
선언한 WebAuthenticationDetails 객체의 인스턴스를 만들기 위해선
AuthenticationDetailsSource을 구현하는 객체가 필요하다.
해당 구현 객체를 통해, 앞서 만든 VO를 초기화한다.
public class 커스텀인증디테일즈소스 implements AuthenticationDetailsSource<HttpServletRequest, 커스텀웹인증디테일즈> {
@Override
public 커스텀인증디테일즈소스 buildDetails(HttpServletRequest request) {
return new 커스텀웹인증디테일즈(request);
}
}
"커스텀인증디테일즈소스"를 인증과정에서 호출하기 위해선,
security 설정에 해당 객체를 추가해야한다.
security 버전 5.x의 경우, xml설정파일의 form-login 설정에 "커스텀인증디테일즈소스"를 추가한다.
<sec:http auto-config="true" entry-point-ref="인증엔트리포인트" access-decision-manager-ref="인증결정매니저" >
<sec:csrf disabled="true"/>
<sec:form-login
login-page="로그인페이지url"
username-parameter="사용자아이디"
password-parameter="사용자패스워드"
login-processing-url="로그인url"
authentication-success-handler-ref="인증성공핸들러"
authentication-failure-handler-ref="인증실패핸들러"
authentication-details-source-ref="커스텀인증디테일즈소스"
/>
<sec:logout logout-url="로그아웃url" invalidate-session="true" logout-success-url="/" delete-cookies="JSESSIONID" />
<sec:access-denied-handler ref="접근거부핸들러" />
</sec:http>
<bean id="커스텀인증디테일즈소스" class="클래스경로.커스텀인증디테일드소스" />
부가정보 전달 프로세스를 구현하고 인증과정을 테스트를 해보니,
아래 캡처와 같이 loginMethod 부가정보가 추가되었고,
해당 부가정보도 정상적으로 받아오는 것을 확인할 수 있었다.

참고
스프링 시큐리티 - Authentication, SecurityContext
본 게시물은 스스로의 공부를 위한 글입니다.잘못된 내용이 있으면 댓글로 알려주세요!사용자의 인증 정보를 저장하는 토큰 개념.2가지 용도로 사용된다. 인증 용도 또는 인증 후 세션에 담기
velog.io
https://dev-coco.tistory.com/174
Spring Security의 구조(Architecture) 및 처리 과정 알아보기
시작하기 앞서 스프링 시큐리티에서 어플리케이션 보안을 구성하는 두 가지 영역에 대해 간단히 알아보자. 인증(Authentication)과 인가(Authorization) 대부분의 시스템에서는 회원을 관리하고 있고,
dev-coco.tistory.com
'Language > JAVA' 카테고리의 다른 글
| [Java] 자바 streamAPI를 활용한 데이터연계 코드 리팩토링 (0) | 2024.03.31 |
|---|---|
| [Spring] Spring DI(Dependency Injection) (2) | 2024.02.04 |
| [JAVA] JAVA LTS버전 비교 (2) | 2024.01.14 |

