💐 Spring/Spring Security

12. JWT 토큰 Authorization을 위한 커스텀 필터 생성

2021. 11. 4. 14:37
목차
  1. BasicAuthenticationFilter 상속
  2. doFilterInternal
반응형

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

 

로그인 요청이 오면 사용자 인증 후 JWT 토큰을 생성하여 클라이언트에게 응답해줬습니다.

이제 사용자는 매번 로그인을 하는 것이 아니라, 이전에 발급 받은 JWT 토큰을 들고 서버로 요청을 하면 

서버는 해당 JWT 토큰을 검증하여 유효한 토큰인지 확인 후 클라이언트 요청을 처리해주면 됩니다.

 

이번 시간에는 JWT 토큰을 검증할 수 있는 Filter를 생성해보도록 하겠습니다.

 

BasicAuthenticationFilter 상속

BasicAuthenticationFilter.doFilterInternal

헤더에 Authorization : Basic *** 방식으로 인증을 시도하면 BasicAuthenticationFilter에서 해당 토큰을 검증하여 인증을 처리하는데,

우리는 Basic 방식이 아닌, JWT를 사용할 것이기 때문에 해당 메소드를 오버라이딩 해주도록 하겠습니다.

 

doFilterInternal

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {

    String jwt_Header = request.getHeader("Authorization");

    // 토큰 값이 올바르게 들어있는지 체크!
    if(jwt_Header != null && jwt_Header.startsWith("Bearer")) {

        // JWT 추출
        String jwtToken = jwt_Header.replace("Bearer", "").trim();

        // JWT Verify (검증) -> 검증 실패 시 exception 발생
        String username = JWT.require(Algorithm.HMAC256("secret")).build().verify(jwtToken).getClaim("username").asString();

        // Verify 통과? -> 서명이 완료되었다는 뜻.
        // username이 비어있진 않은지 체크
        if (username != null && !username.equals("")) {
            UserDetails userDetails = accountService.loadUserByUsername(username);

            // AuthenticationManager로 인증을 하면 실제 로그인을 할때에 필요한 작업이나,
            // Authentication authenticate = getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()));

            // 현재 우리는 Token 서명으로 무결성을 검증하였기 때문에 username을 가지고 강제로 Authentication 을 만들어 securityContextHolder에 넣어주면 됩니다.
            Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities());
            // 세션 저장 (권한 관리를 위해서)
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
    }

    doFilter(request, response, chain);

}
  • 먼저 헤더에 Authorization 값을 뽑아 옵니다.
  • 해당 값이 있는지, Bearer 방식의 토큰인지 확인을 합니다.
  • JWT 토큰 값을 추출하여 verify를 시도합니다.
  • 토큰 검증에 성공하였다면, user 정보를 가지고 Authentication 객체를 생성합니다.
  • SecurityContextHolder에 담습니다. (이때, 권한 관리를 위해 세션을 저장하는 것입니다.)
반응형
저작자표시 (새창열림)
  1. BasicAuthenticationFilter 상속
  2. doFilterInternal
'💐 Spring/Spring Security' 카테고리의 다른 글
  • (Deprecated) WebSecurityConfigurerAdapter에 대응하기
  • Spring Security Error Code 별 페이지 처리하기
  • 11. JWT 로그인을 위한 UsernamePasswordAuthenticationFilter 상속
  • UsernamePasswordAuthenticationFilter 동작 방식에 대해서
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
12. JWT 토큰 Authorization을 위한 커스텀 필터 생성
상단으로

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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