Project/SmartFarm:개발일지

[개발일지] 프로젝트 9일차 : Spring Security 로그인 인증

SuperDev 2025. 2. 19. 13:12

1. Spring Security 로그인 인증 기능 구현

SecurityfilterChain을 통해서 로그인 인증을 구현하는 로직을 작성하였습니다. 인증 과정을 직접 경험하기 위해 시큐리티에서 제공하는 기본 form을 사용하지 않고, AuthencicationManager를 통해 인증 과정을 대략적으로 경험해보았습니다. 

 

1.1. 로그인 인증 단계

순서 구분 내용
1 로그인 요청 - 클라이언트가 /login 엔드포인트로 email과 password를 포함한 POST 요청을 보냅니다.
- SecurityAuthFilter가 이 요청을 가로채서 처리합니다.
2 인증 토큰 생성 - SecurityAuthFilterattempAuthentication 메서드 동작
- 요청 body에서 email과 password를 추출
- UsernamePasswordAuthenticationToken 토큰 생성
- 이 토큰을 AuthencicationManager에 전달
3 사용자 정보 조회 - DaoAuthenticationProvider가 인증 프로세스를 처리
- MemberDetailsService를 호출하여 사용자 정보 조회
- MemberMapper를 통해 데이터베이스에서 사용자 정보 조회
- 조회된 정보를 바탕으로 UserDetails 객체 생성
4 비밀번호 검증 - DaoAuthenticationProvider가 제공된 비밀번호와 저장된 비밀번호를 비교
- 동작 테스트를 위해 평문 비교 진행(password 해시화 X)
5 인증 완료 - 인증 성공 시, HTTP 세션 생성(30분 타임아웃)
- 인증 실패 시, 401 Unatuthorized 응답 반환

 

 

1.2. 왜 인증 토큰을 생성하나요?

로그인 요청에서 바로 사용자 정보 조회로 가는 것이 아니라 "인증 토큰을 생성하는 이유가 뭘까?" 문득 의문이 들어서 궁금증을 해결하기 위해 GPT 및 블로그들을 통해서 확인해보았습니다.

 

1.2.1. 인증 방식의 추상화

  • UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현하기 때문에, 이메일/비밀번호 외에도 다양한 인증 방식(예: OAuth, JWT 등)을 동일한 방식으로 처리할 수 있게 해줍니다. 즉, 인증 토큰은 "어떤 방식으로 인증할 것인가"를 캡슐화한 것 입니다.

1.2.2. 인증 상태 관리

  • 인증 토큰은 2가지 상태를 가집니다.
    // 인증 전 상태
    new UsernamePasswordAuthenticationToken(email, password);
    
    // 인증 후 상태
    new UsernamePasswordAuthenticationToken(userDetails, null, authorities);


1.2.3. 책임 분리

  • `SecurityAuthFilter`: POST 요청에서 인증 정보 추출
  • `AuthenticationMager`: 인증 프로세스 관리
  • `AuthenticationProvider`: 구체적인 인증 로직 수행
  • 토큰은 이들 사이의 표준화된 `데이터 전달 객체 역할`을 하게 됩니다.

1.2.4. 보안 강화

  • 인증 정보가 토큰 객체로 캡슐화되어 있어 직접적인 password 노출을 방지합니다.
  • 인증 프로세스 전체에서 일관된 형태로 인증 정보를 다룰 수 있습니다. 

 

1.3. 시퀸스 다이어그램

 

 

1.4. 문제점 및 해결안

인증 방식을 하나의 클래스로 구현하였는데, 새로운 인증 방식으로 변경하게 되면 기존 코드를 수정해야 하는 문제가 발생합니다. 기존 코드의 변경 없이 인증 방식을 변경하려면 추상화된 인터페이스를 생성하고 구현체를 통해 인증 방식을 구체화하는 것이 좋겠다는 생각을 했습니다. 그리고 단일책임원칙에 따른 로직 분리가 잘 이루어지지 않아 이부분도 함께 개선해야겠습니다.

728x90