Back-End/Spring (SpartaCC)

[Spring] 스파르타코딩클럽 Spring공부(4) - 인증/인가, 쿠키/세션, 필터

남건욱 2023. 6. 20. 06:48

목차

    반응형
    Bean 수동등록
    Bean 수동 등록은 어제 사용될까?
    기술적인 문제나 공통적인 관심사를 처리할 때 사용되는 객체들을 수동으로 등록하는 것이 좋다.

    - @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해 준다.

    - 일반적으로 @Component를 사용하여 Bean을 자동등록으로 하는 것이 좋다.

     

    Bean 수동등록이 사용되는 경우

    - 공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동등록 한다.

    - 비즈니스 로직 Bean보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않다.

    - 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있다.

     

    @Configuration
    public class PasswordConfig {
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }

    - Bean으로 등록하고자 하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정한다.

    - Bean을 등록하는 메서드가 속한 클래스에 @Configuration을 설정한다.

    이렇게 해주면 Spring 서버가 뜰 때 Spring IoC컨테이너에 Bean으로 저장된다.

     

     

     

     

    Primary
    @Component
    @Primary
    public class Chicken implements Food {
        @Override
        public void eat() {
            System.out.println("치킨을 먹습니다.");
        }
    }

    위와 같이 등록하게 되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean객체를 주입해 준다.

     

     

     

    Qualifier
    @Component
    @Qualifier("pizza")
    public class Pizza implements Food {
        @Override
        public void eat() {
            System.out.println("피자를 먹습니다.");
        }
    }
    
    
    ///////////////////////////////////////////////
    
    
    @SpringBootTest
    public class BeanTest {
    
        @Autowired
        @Qualifier("pizza")
        Food food;
    
        @Test
        @DisplayName("Primary 와 Qualifier 우선순위 확인")
        void test1() {
            // 현재 Chicken 은 Primary 가 적용된 상태
            // Pizza는 Qualifier 가 추가된 상태입니다.
            food.eat();
        }
    }

    Qualifier를 사용할 때는 먼저 사용할 클래스에 @Qualifier를 사용하여 이름을 추가해 준다.

    그 후 주입하고자 하는 필드에도 @Qualifier를 추가해 주면 해당 Bean 객체가 주입된다.

     

    - 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높다.

    - 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정 아고, 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.

     

     

     

     

     

    인증과 인가
    인증 (Authentication)
    - 해당 유저가 실제 유저인지 검증하는 개념
    
    인가 (Authorization)
    - 해당 유저가 특성 리소스에 접근이 가능한지 허가를 확인하는 개념

    - 일반적으로 웹 애플리케이션 인증 구조는 서버-클라이언트로 되어있고, 실제로 이 두 가지 요소는 아주 멀리 떨어져 있다.

    - HTTP를 사용하여 통신하는데, 그 통신은 비연결성 무상태로 이루어진다.

     

     

     

     

    쿠키와 세션
    쿠기와 세션 모두 HTTP에 상태 정보를 유지 (Stateful)하기 위해 사용된다. 즉, 쿠키와 세션을 
    통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

    쿠키

    - 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일이다.

    - 구성요소

    Name (이름) : 쿠키를 구별하는 데 사용되는 키 (중복 X)

    Value (값) : 쿠키의 값

    Domain (도메인) : 쿠키가 저장된 도메인

    Path (경로) : 쿠키가 사용되는 경로

    Expires (만료기한) : 쿠키의 만료기한 (만료기한이 지나면 삭제)

     

    세션

    - 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용

    - 서버에서 클라이언트 별로 유일무이한 '세션 ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장

    - 서버에서 생성한 '세션 ID'는 클라이언트의 쿠키값으로 저장되어 클라이언트 식별에 사용된다

     

     

     

     

     

    JWT
    JWT (Json Web Token) 
    - JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim기반의 Web Token 이다.
      토큰의 한 종류이고, 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다.

    장점 

    - 동시 접속자가 많을 때 서버 측 부하를 낮춤

    - 클라이언트, 서버가 다른 도메인을 사용할 때

     

    단점

    - 구현의 복잡도 증가

    - JWT에 담는 내용이 커질수록 네트워크 비용 증가

    - Secret Key 유출 시 JWT 조작 가능

     

     

     

     

     

    JwtUtil
    Util 클래스란 특정 매개 변수(피라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스

    <JWT 관련 기능>

    - JWT 생성

    - 생성된 JWT를 Cookie에 저장

    - Cookie에 들어있던 JWT 토큰을 Substring

    - JWT 검증

    - JWT에서 사용자 정보 가져오기

     

     

     

     

    Filter
    Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의
    위치이며, 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다.

    - 범용적으로 처리해야 되는 작업들, 예를 들어 로깅 및 보안처리에 활용한다.

    - 인증, 인가와 관련된 로직들을 처리할 수도 있다.

    - Filter를 사용하면 인증, 인가와 관련된 로직을 비즈니스 로직과 분리하여 관리할 수 있다는 장점이 있다.

    - Filter는 한 개만 존재하는 것이 아니라, 여러 개가 Chain형식으로 묶여서 처리될 수 있다.

     

     

     

     

    정리

    Primary와 Qualifier 두 개가 동시에 적용되면 Qualifier가 먼저 우선순위에 담긴다는 것을 알았다. 또한 쿠키와 세션은 항상 함께 붙어 다니지만 정확한 개념과 차이점을 몰랐는데 이 부분에 대해서 자세히 알게 되었다. JWT는 기존 서버에서 세션을 관리하는 방식이 아닌 클라이언트에게 JWT값을 넘기고 클라이언트에서 요청을 수행할 때 넘겨준 JWT값을 포함하여 서버에 요청이 들어오는 방식으로 장단점을 확인하였다. 그리고 Filter를 사용하여 서블릿으로 가기 전 필터를 걸치게 하여 다양한 기능들을 수행하게 할 수 있다는 것을 공부하게 되었다. 이번에 공부한 내용은 다행히도 개념부분은 이해하기는 쉬웠다. 실제로 구현할 때 이해하고 사용하는 것이 더 중요하다고 생각된다. 글 작성을 마친 후 직접 코딩을 해보며 내가 놓친 부분이 있는지 검토할 예정이다.

    반응형
    프로필사진

    남건욱's 공부기록