💐 Spring/Spring Security

11. JWT 로그인을 위한 UsernamePasswordAuthenticationFilter 상속

2021. 11. 2. 17:38
목차
  1. attemptAuthentication
  2. 커스텀 Filter 생성
  3. successfulAuthentication
반응형

이 포스트는 데어 프로그래밍님의 유튜브 강의를 듣고 나서 정리한 글입니다.

 

UsernamePasswordAuthenticationFilter에 대해서는 아래 포스팅을 참조하시길 바랍니다.

 

UsernamePasswordAuthenticationFilter 동작 방식에 대해서

SpringSecurity Filterchain 에는 여러 종류에 필터가 존재하지만, 이번 시간에는 로그인 인증을 처리하는 UsernamePasswordAuthenticationFilter에 대해서 알아보겠습니다. Login 인증 로직 flow POST "/login"..

iseunghan.tistory.com

 

로그인 요청을 처리하기 위해서는 SpringSecurityFilterChain 중에 로그인 인증을 처리하는 필터인 UsernamePasswordAuthenticationFilter를 상속해야 한다.

 

attemptAuthentication

UsernamePasswordAuthenticationFilter.attemptAuthentication

  • POST "/login"
  • 로그인 요청이 오면, UsernamePassword..Filter가 가로채서 attemptAuthentication 메소드를 호출합니다.
  • 우리는 해당 메소드를 오버라이딩 하여 로그인 인증 로직을 구현해보겠습니다.

 

커스텀 Filter 생성

public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {

        // Form 방식으로만 getParameter로 뽑아낼 수 있음. JSON은 안됨!
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // username, password를 담아서 UsernamePasswordAuthenticationToken을 생성한다.
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);

        // 생성한 토큰을 담아서 authenticationManager.authenticate를 호출하면, UserDetailsService의 loadUserByUsername()이 호출됨
        return this.authenticationManager.authenticate(token);
    }
}
  • username과 password를 뽑아서, UsernamePassword..Token을 생성해줍니다. *(아직 인증이 완료되지 않은 상태)
  • 해당 토큰을 authenticationManager에게 넘겨 인증 권한을 위임합니다.

 

여기서 인증이 완료되면 -> successfulAuthentication

여기서 인증이 실패하면 -> unsuccessfulAuthentication

 

successfulAuthentication

@Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
    	// UserDetails 구현체 받아오기
        AccountAdapter account = (AccountAdapter) authResult.getPrincipal();

		// JWT 토큰 생성
        String jwtToken = JWT.create()
                .withSubject(account.getUsername())
                .withClaim("exp", Instant.now().getEpochSecond() + 600)
                .withClaim("id", account.getAccount().getId())
                .withClaim("username", account.getUsername())
                .sign(Algorithm.HMAC256("secret"));

		// Authorization 헤더 값에 Bearer 토큰 담아서 응답
        response.addHeader("Authorization", "Bearer " + jwtToken);
    }
  • 응답 헤더에 JWT 토큰 담아서 응답!

 

클라이언트가 요청을 했을 때, 서버에서 JWT 토큰을 서버에서 응답을 해줬으면, 클라이언트가 요청할 때마다 JWT 토큰을 들고 요청 할것입니다.

(우리는 이제 해당 JWT 토큰이 올바른 토큰인지 확인해주면 된다!)

 

다음 시간에 JWT 토큰을 검증하는 필터를 생성해서 해당 JWT이 올바른 토큰인지 검증해보도록 하겠습니다. 

감사합니다.

 

반응형
저작자표시 (새창열림)
  1. attemptAuthentication
  2. 커스텀 Filter 생성
  3. successfulAuthentication
'💐 Spring/Spring Security' 카테고리의 다른 글
  • Spring Security Error Code 별 페이지 처리하기
  • 12. JWT 토큰 Authorization을 위한 커스텀 필터 생성
  • UsernamePasswordAuthenticationFilter 동작 방식에 대해서
  • 10. JWT 로그인을 위한 UserDetails, UserDetailsService 구현하기
iseunghan
iseunghan
꾸준하게 열심히..
iseunghan
iseunghan

공지사항

  • 어제보다 나은 오늘이 되기 위해 🔥
  • 분류 전체보기 (262)
    • 💐 Spring (14)
      • 개념 및 이해 (2)
      • Spring 핵심 기술 (24)
      • Spring REST API (8)
      • Spring MVC, DB 접근 기술 (7)
      • Spring Security (23)
      • Spring in Action (1)
    • 🌻 JAVA (84)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
      • 알고리즘, 자료구조 (13)
      • 디자인 패턴 (7)
      • 정리정리정리 (43)
      • JUnit (1)
    • 🔖 Snippets (3)
      • Javascript (3)
    • ⚙️ Devops (22)
      • ⛏ Git (11)
      • 🐳 Docker (6)
      • 🐧 Linux (3)
      • 🌈 Jenkins (1)
      • 📬 Kafka (1)
    • 💬 ETC.. (4)
      • 💻 macOS (2)
    • 🌧️ ORM (2)
      • JPA (2)
    • 🐍 Python (3)
    • 📚 Databases (15)
      • 오라클로 배우는 데이터베이스 개론과 실습(2판) (3)
      • RealMySQL 8.0 (8)
    • 🔥 Computer Science (5)
      • 📡 네트워크 (5)
    • 🏷️ 협업 (1)
    • 📜 코딩테스트 (38)
      • BAEKJOON\수학 1, 수학 2 (8)
      • BAEKJOON\재귀 (5)
      • BAEKJOON\브루트 포스 (3)
      • BAEKJOON\정렬 (1)
      • BAEKJOON\백트래킹 (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\이분탐색 (1)
      • BAEKJOON\다이나믹 프로그래밍 (9)
      • BAEKJOON\그리디 알고리즘 (0)
    • ✨ ISEUNGHAN (1)

인기 글

전체
오늘
어제
반응형
hELLO · Designed By 정상우.
iseunghan
11. JWT 로그인을 위한 UsernamePasswordAuthenticationFilter 상속
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.