ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security + JWT, Servlet Filter
    Security 2021. 12. 21. 17:59

    서블릿 필터와 관련된 내용

     

    Filter
    • 서블릿과 비슷한 자바 컴포넌트
    • request, response 객체가 필터를 거친다
    • init() -> doFilter() -> destroy() 생명주기

    필터는 서블릿과 비슷한 자바 컴포넌트 입니다. 컨테이너에 전달된 요청이 서블릿을 호출하기 전에 이 필터를 거치게 됩니다

     

    what is 서블릿 ?

    서버에서 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 Java 로 작성된 프로그램

    Servlet flow

     

    what is 컴포넌트 ?

    독립적인 모듈이다

     

    하드웨어 제품들은 독립된 모듈로 만들어진다

    소프트웨어를 독립적으로 개발되지 않은 경우가 많고 독립적으로 개발되어도 다른 모듈과의 호환을 생각하지 않고 개발된다

    이러면 소프트웨어의 재사용을 어렵게하고 유지보수 비용이 크게 증가하는 원인이 된다

    소프트웨어 재사용의 중요성과 필용성을 위해 나온 기술이 컴포넌트 기술

     

    what is 모듈 ?

    컴퓨터 시스템에서, 부품을 떼 내어 교환이 쉽도록 설계되어 있을 때의 각 부분

     

    컴포넌트 개념과 객체지향 언어

    상호간의 단자만 규격에 맞을시 어떠한 모듈을 교환하더라도 제품은 정상 작동한다

    객체지향 언어에서는 인터페이스로 제공해준다

    소프트웨어 세부내용은 인터페이스를 구현받은 클래스가 작성한다

    하나의 컴포넌트는 여러개의 클래스로도 작성될 수 있다

    컴포넌트 개념을 잘 적용한 소프트웨어는 부품(인터페이스를 구현받은 클래스)만 바꾸었을 때 오류없이 작동되는 것

     

    Spring-Boot_JWT

     

     

     

    Spring-Boot JWT Source

     

    JWT 사용을 위해 구성된 클래스 역할 정리

     

    • TokenProvider class

    이 클래스는 토큰의 생성과 토큰의 유효성 검증들을 담당하며 사용자 지정 초기화를 수행하거나 모든 필수 속성이 설정되었는지 확인하는 클래스

    §TokenProvider 생성자는 application.yml 선언한 jwt secret 값과 토큰 만료시간 값을 가져와서 전역변수의 세팅한다
    §afterPropertiesSet 메소드는 생성자에서 세팅한 secret 값을 Base64 Decode 한 바이트 배열을 HMAC-SHA 알고리즘에 사용할 인스턴스를 생성해 key 전역변수에 할당
    §createToken 메소드는 토큰 만료시간 세팅, 실제 JsonWebToken 생성하는 코드, Authentication 객체의 권한정보를 이용하기 위한 코드가 존재
    §getAuthentication 메소드는 사용자 요청시(HttpServletRequest) 전달받은 토큰을 파라미터로 받아 클레임을 생성, 생성한 클레임에서 권한정보들을 파싱, spring security 에서 제공하는 User 객체를 사용해서 클레임에 저장된 subject, password, 파싱한 권한정보를 인자값으로 사용, UsernamePasswordAuthenticationFilter 에서 가로챈 username, password 인증 후의 토큰 반환
    §validateToken 메소드는 파라미터로 전달받은 토큰을 파싱해서 JWT 가 잘못된 서명인지, 만료된 토큰인지, 지원되지 않는 토큰인지, 토큰자체가 잘못된건지 검증하는 코드
     
    • JwtFilter class

    JWT 를 위한 커스텀 필터, Spring Security 에는 많은 Filter 들을 제공하는데 하지만, 제공하는 Filter 가 아니라 Custom Filter 가 필요할 때 가장 일반적으로 사용되는 GenericFilterBean 을 상속한 클래스

    §JwtFilter 생성자는 토큰을 생성하고 토큰 유효성 검증을 담당할 TokenProvider 를 가져온다
    §doFilter 메소드는 resolveToken 을 통해 가져온 토큰을 유효성검증을 진행해서 정상일때와 비정상일 때를 구분한다, 마지막으로 필터체인에 연결해준다
    §resolveToken 메소드는 doFilter 메소드를 통해 필터링을 하기위해 토큰 정보가 필요하니까 Request Header 에서 토큰 정보를 꺼내오는 메소드
     
    • JwtSecurityConfig class
    §JwtSecurityConfig 생성자는 토큰을 생성하고 토큰 유효성 검증을 담당할 TokenProvider 를 가져온다
    §Configure 메소드는 TokenProvider, JwtFilter SecurityConfig 에 적용할 때 addFilterBefore 메소드를 활용하여 JwtFilter UsernamePasswordAuthenticationFilter 보다 먼저 실행되게 세팅한다
     
    • SecurityConfig class

    프로젝트의 모든 보안 설정과(Web 보안, HTTP 통신보안) JWT 인증을 위한 클래스

    §SecurityConfig 생성자는 TokenProvider, JwtAuthenticationEntryPoint, JwtAccessDeniedHandler 클래스 기능을 사용하기 위해서 전역변수에 세팅한다
    §passwordEncoder 메서드는 패스워드를 인코딩 해주는 SHA-1 암호화 메서드
    §configure 메서드는 파라미터 값이 다른 2개를 사용중이다
    1.WebSecurity : 제공하는 기능중에 web 요청중에 favicon.ico 요청을 모두 무시하는 로직
    2.HttpSecurity : 제고하는 기능중에 http 요청중에 csrf disable, exception handling, 세션을 사용하지 않기 때문에 session stateless, 사용자가 처음 접근했을 때 토큰을 받기 위한 로그인 API, 회원가입 API 는 모두 허용해준다, 마지막으로 addFilterBefore 등록했던 JWT 를 위한 커스텀 필터까지 적용
     
    • SecurityUtil class

    보안 관련 내용을 활용하기 위한 클래스

    Controller 에서 조회하고 싶은 데이터 확인용 클래스 인데 사용 안해도 상관없는 클래스

    §getCurrentUsername 메서드는 현재 인증된 유저의 이름을 가져오는 메서드, SecurityContext 저장된 Authentication 객체를 가져오고 Authentication 객체가 null 인지 체크 후 가져온 Authentication 객체를 이용해 username 을 리턴
     
    • UserService class

    DB 정보를 조회하거나 저장하는 클래스

    실제 데이터베이스에 접속해 저장, 수정, 조회, 삭제를 수행하는 로직 작성하는 클래스 (Query 작성 클래스는 아니다)

    §UserService 생성자는 UserRepository, PasswordEncoder 클래스 기능을 사용하기 위해서 전역변수에 세팅한다
    §signUp 메서드는 UserDTO 로 전달받은 username 을 이용해 DB에 존재하는 username 이면 이미 가입된 유저라는 메시지를 전달하고 존재하지 않는 유저라면 권한 정보를 만들고 User Entity 에 정보를 담는다, 마지막으로 DB 저장을 한다
    §getUserWithAuthorities 메서드는 username 파라미터로 받아서 해당하는 User 정보와 Authority 정보를 가져온다

    getMyUserWithAuthorities 메서드는 현재 SecurityContext 저장되어있는 username 에 해당하는 User 정보와 Authority 정보를 가져온다

     

    • CustomUserDetailService class

    토큰에 저장된 유저 정보를 활용해야 하기 때문에 클래스를 만들고 UserDetailService 를 상속받아 재정의 하는 과정을 진행

    §loadUserByUsername 메서드는 username 을 이용하여 권한정보를 DB 에서 가져오는 로직

    createUser 메서드는 User 엔티티에 저장된 활성화여부 체크 후 Entity에서 권한정보들을 가져와 List에 담고 Spring Security 에서 이용할 수 있게 org.springframework.security.core.userdetails.User 객체에 세팅 후 반환한다

     

     

    Java Authentication 객체가 뭐하는 놈이지?

    현재 자바코드를 실행하고 있는 사용자가 누구인지 확실하고 안전하게 결정함

    Java Authorization 객체가 뭐하는 놈이지?

    수행된 행위를 하는데 필요한 ACL (접근권한제어, 권한)을 가지고 있는지 확인함

    Java UsernamePasswordAuthenticationToken 뭐하는 놈이지?

    Authentication 인터페이스의 구현체 클래스 요청으로부터 usernamepassword를 얻어온 값으로 UsernamePasswordAuthenticationToken 생성, AuthenticationManager 에게 인증을 진행하도록 위임

    Java BCryptPasswordEncoder 객체가 뭐하는 놈이지?

    Spring security 프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스

    5.4.2 버전 이후부터는 3개의 메서드, 그 이전 버전은 2개의 메서드를 가진다

    encode() : SHA-1 8바이트 해시 패스워드를 암호화해주는 메서드

    matchers() : 인코딩 되지 않은 패스워드와 인코딩 된 패스워드의 일치 여부 확인 메서드

    upgradeEncoding() : 더 나은 보안을 위해서 인코딩 된 암호를 다시 한번 더 인코딩해야 하는 경우에 사용


    참고자료

     

    https://mommoo.tistory.com/55

     

    컴포넌트(Component)란?

    컴포넌트(Component)개념의 등장배경 과 의미에 대해 기술한다. 컴포넌트 개념의 유래 많은 하드웨어 제품들은 각각 독립된 기능을 가진 모듈로 만들어진다. 이 제품들은 회사 상관없이 서로 조합

    mommoo.tistory.com

    https://terms.naver.com/search.naver?query=%EB%AA%A8%EB%93%88 

     

    모듈 : 네이버 지식백과

     

    terms.naver.com

    https://coding-factory.tistory.com/742

     

    [Web] 서블릿(Servlet)이란 무엇인가? 서블릿 총정리

     서블릿(Servlet)이란? 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이

    coding-factory.tistory.com

     

    'Security' 카테고리의 다른 글

    DB 서버 id, password 암호화  (0) 2023.03.08
    JWT (JSON Web Token) 소개  (0) 2021.11.17
Designed by Tistory.