1. Spring Framework vs SpringBoot

2. IoC

3. Bean + 등록방법

4. Spring MVC 흐름

5. Filter vs Interceptor


study 준비

- VO, BO, DAO, DTO에 대해 설명해주세요

- DI(Dependency Injection)에 대해 설명해주세요

- ORM에 대해 설명해주세요

- JPA(Java Persistent API)에 대해 설명해주세요

- ORM, JPA, Hibernate의 장단점에 대해 설명해주세요

- Spring을 사용하면 어떤 이점이 있는지 설명해주세요

- Servlet이란 무엇일까요?

- 프로젝트에서 사용했던 Annotation 중에 기억에 남는 것, 해당 Annotation의 역할

- JWT에 대해서 설명해주세요

- Dispatcher Servlet란 무엇인지 설명해주세요

- Spring Container란 무엇인지 설명해주세요


참고 : https://dev-coco.tistory.com/163?category=1056309
참고 : https://velog.io/@kk1112k
참고 : https://wookcode.tistory.com/99

Spring Framework vs Spring Boot

스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 엔터프라이즈 서비스들을 POJO 기반으로 만든 비즈니스 오브젝트에서 사용할 수 있게 해줍니다. IoC 컨테이너를 제공해서, 인스턴스들의 라이프 사이클을 관리합니다. 또한 특정 인터페이스를 구현하거나 상속할 필요가 없고 라이브러리를 지원하기에 용이하며 객체 또한 가벼운 것이 특징입니다. 그리고 OOP를 더 OOP답게 쓸 수 있게 해주는 AOP 기술을 적용해서 POJO 개발을 더 쉽게 만들어줍니다.

스프링 부트는 스프링에서 사용하는 프로젝트를 간편하게 셋업할 수 있는 서브 프로젝트입니다. 독립 컨테이너에서 동작할 수 있기 때문에 임베디드 톰캣에서 자동으로 실행됩니다. 또한 과거에는 dependency를 직접 관리해줘야했는데 이제 starter가 대부분의 dependency를 관리해줍니다. XML 설정을 하지 않아도되고, jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하고, Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공합니다.

  • POJO?
    Plain Old Java Object의 약자로 EJB등에서 사용되는 Java Bean이 아닌 Getter Setter로 구성된 가장 순수한 형태의 기본 클래스를 POJO라 합니다. EJB의 사용과 프로그램의 규모 증가로 특정 기술과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수에 어려움이 생기게되고 또한, 특정 기술의 클래스를 상속받거나, 직접 의존하게 되어 확장성이 매우 떨어지며 점점 객체지향성을 잃어갔습니다. 그래서 개발자들은 옛날 순수한 객체지향성이 컸던 시절로 돌아가자는 취지로 POJO를 개발하게 되었습니다.
  • POJO Framework?
    단순히 EJB 이전으로 돌아간다면 의미가 없기 때문에 POJO 프레임워크가 등장하게 됩니다. POJO 프레임워크는 POJO를 사용하는 장점과 EJB에서 제공하는 엔터프라이즈 서비스와 기술을 그대로 사용할 수 있도록 도와주는 프레임워크입니다. 많은 POJO 프레임워크가 있지만 그중에서 손꼽히는 것은 하이버네이트와 스프링입니다.
  • POJO 기반의 코드인지를 확인하는 두가지 기준?
    객체지향적으로 설계되었는가? 반복적인 템플릿 코드와 테스트하기 힘든 구조, 확장 및 재활용의 어려움이 남아있다면 EJB의 문제점을 여전히 안고 있는 것입니다. 테스트가 용이한가? 잘 만들어진 POJO 어플리케이션은 자동화된 테스트 코드 작성이 편리합니다. 코드 작성이 편리하면 더 꼼꼼하게 만들겍되고, 코드 검증과 품질 향상에 유리해집니다. 또한, 잘 만들어진 테스트 코드베이스가 있다면 리팩토링할 여유가 생겨 POJO코드를 좀 더 나은 설계구조로 변경할 수 있습니다.
  • EJB?
    Enterprise JavaBeans의 약자로 자바 개발에 있어 로우 개발에 신경을 쓰지않도록 애플리케이션을 쉽게 만들어주는 기술입니다. 하지만, EJB는 객체지향성을 감소시키는 단점이 있습니다.
  • AOP?
    Aspect Oriented Programming의 약자로 관점 지향 프로그래밍은 OOP를 돕는 보조적인 기술로, 기능의 분리의 문제를 해결하기 위해 만들어진 프로그래밍 패러다임입니다. AOP는 기능을 Core Concern과 Cross-Cutting Concern(공통 관심 사항)분리시키고 각각을 모듈화하는 것을 의미합니다. 업무 로직을 포함하는 기능을 Core Concern, 핵심 기능을 도와주는 부가적인 기능 예를들어 데이터베이스 연결, 로깅, 파일 입출력 등을 Cross-cutting Concern이라고 부릅니다. OOP를 적용하여도 핵심 기능에서 부가 기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 해결해주는 것입니다.
  • AOP vs OOP
    AOP는 Aspect Oriented Programming의 약자로, 관점 지향 프로그래밍이라고합니다. 어플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 Aspect라는 모듈로 만들어 설계하고 개발하는 방법입니다. OOP는 Object Oriented Programming의 약자로 객체지향 프로그래밍이라고 합니다. OOP와 AOP는 서로 상반되는 개념은 아니며 OOP를 더욱 OOP답게 사용할 수 있도록 하는 것이 AOP입니다.
  • AOP 등장 이유1
    공통적 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 사용하는데 Java에서는 다중 상속이 불가능합니다. 그리고 기능 구현 부분에서 핵심 코드와 공통 기능 코드가 섞여있어서 보기에도 불편하고, 효율성이 떨어집니다. 이러한 이유로 AOP가 등장했습니다.


IoC란?

[간단하게] 제어의 역전이라고 하는 Inversion of Control이란 모든 객체에 대한 제어권을 개발자가 아닌 IoC컨테이너에게 넘긴 것을 말합니다. 객체 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다.

[추가] IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리합니다. POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가집니다. 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡기면서 개발자는 비즈니스 로직에 집중할 수 있게 됩니다. 또한 객체 생성 코드가 없으므로 TDD가 용이합니다.

+IoC 분류 : DL(Dependency Lookup)과 DI(Dependency Injection)

  • DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Look up 하는 것
  • DI : 각 클래스간의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
  • DL 사용시 컨테이너 종속이 증가하기 때문에 주로 DI를 사용합니다.

+IoC 컨테이너 종류 : 스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고, 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부릅니다. 객체의 생성과 객체 사이의 런타임 관계를 DI관점에서 볼 때 컨테이너를 BeanFactory라고 합니다. BeanFactory에 여러가지 컨테이너 기능을 추가한 어플리케이션컨텍스트(Application Context)가 있습니다.

  • BeanFactory : BeanFactory계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리하는 기능만 제공합니다. Bean을 등록, 생성, 조회, 반환 관리를 합니다. 팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스입니다. Bean을 조회할 수 있는 getBean()메소드가 정의되어있으며 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicaionContext를 사용합니다.
  • ApplicationContext : Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같습니다. 스프링의 각종 부가 기능을 추가로 제공합니다. 추가적으로 제공하는 기능으로는 국제화가 지원되는 텍스트 메시지 관리, 이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법 제공, 리스너로 등록된 빈에게 이벤트 발생을 알려주는 기능이 있습니다.


Bean + 등록방법

자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있습니다. 이때, 객체들은 독립적으로 동작하는 것보다 서로 상호작용하여 동작하는 경우가 많습니다. 이렇게 상호작용하는 객체를 ‘객체의 의존성’이라고 표현합니다. 스프링에서는 스프링 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입하는 역할을 해줍니다. 그리고 스프링 컨테이너에 등록한 객체들을 ‘빈’이라고 합니다.

빈을 등록하는 방법은 기본적으로 두 가지 방법이 있는데 컴포넌트 스캔과 자동 의존관계 설정 방법과, 자바 코드로 직접 스프링 빈을 등록하는 방법이 있습니다.

스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 클래스 선언부 위에 @Component 어노테이션을 사용하는 것입니다. @Controller, @Service, @Repository는 모두 @Component를 포함하고 있으며 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동을로 생성되어 스프링 빈으로 등록됩니다.

두번째로 수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용해야합니다. 설정 클래스를 만들고 @Configuration 어노테이션을 클래스 선언부 위에 추가하면됩니다. 그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다.

어노테이션 하나로 해결되는 1번 방법이 간단하고 많이 사용되고 있지만, 상황에 따라 2번 방법도 사용됩니다. 1번 방법을 사용해서 개발을 진행하다 MemberRepository를 변경해야 할 상황이 생기면 1번 방법은 일일이 변경해줘야 하지만, 2번 방법을 사용하면 다른건 건들일 필요없이 @Configuration에 등록된 @Bean만 수정해주면 되므로, 수정이 용이하기 때문입니다.

+@Bean 어노테이션의 주요 내용

  • @Configuration 설정된 클래스의 메소드에서 사용 가능
  • 메소드의 리턴 객체가 스프링 빈 객체임을 선언함
  • 빈의 이름은 기본적으로 메소드의 이름
  • @Bean(name=”name”)으로 이름 변경 가능
  • @Scope를 통해 객체 생성을 조정할 수 있음
  • @Component 어노테이션을 통해 @Configuration 없이도 빈 객체를 싱성할 수도 있음
  • 빈 객체에 init(), destroy() 등 라이프 사이클 메소드를 추가한 다음 @Bean에서 지정할 수 있음


Spring MVC 흐름

https://blog.kakaocdn.net/dn/wQtNl/btru2nkxWie/sUL4eKBFf4BRQFs1JE7ijK/img.png

DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC처리 과정을 통제한다.

HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.

HandlerAdadpter : handlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.

ViewResolver : Controller의 처리 결과(데이터)를 생성할 view를 결정한다.

  1. 클라이언트는 URL을 통해 요청을 전송한다.
  2. dispatcherServlet은 handlerMapping을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
  3. dispatcherServlet은 handlerAdapter에게 요청의 전달을 맡긴다.
  4. handlerAdapter는 해당 컨트롤러에게 요청을 전달한다.
  5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
  6. dispatcherServlet은 뷰의 이름을 viewResolver에게 전달하여 반환할 뷰를 찾는다.
  7. dispatcherServlet은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
  8. 데이터가 추가된 뷰를 반환한다.


Filter vs Interceptor

필터는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 합니다. Dispatcher Servlet에 요청이 전달되기 전후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공합니다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고, 스프링 범위 밖에서 처리되는 것입니다.

인터셉터는 쉽게 말해 요청에 대한 작업 전후로 가로채는 것입니다. Dispatcher Servlet이 Controller를 호출하기 전후에 인터셉터가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공합니다. 웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작합니다. Dispatcher Servlet이 핸들러 매핑을 통해 컨트롤러를 찾도록 요청하는데, 그 결과로 실행체인(HandlerExecutionChain)을 돌려줍니다. 여기서 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행합니다.

+[추가] 추가로 둘의 차이에는 Request, Response 객체 조작 가능 여부도 있습니다. 필터는 Request, Response를 조작할 수 있지만, 인터셉터는 조작할 수 없습니다. 필터가 다음 필터를 호출하기 위해서는 필터 체이닝(다음 필터 호출)을 해줘야합니다. 이대 request, response 객체를 넘겨주므로, 우리가 원하는 request, response 객체를 넣어 줄 수 있습니다.하지만 인터셉터는 처리과정이 필터와 다릅니다. Dispatcher Servlet이 여러 인터셉터 목록을 가지고 있고, 순차적으로 실행시킵니다. 그리고 true를 반환하면 다음 인터셉터가 실행되거나 컨트롤러로 요청이 전달되며, false가 반환되면 요청이 중단됩니다. 그러므로 다른 request, response 객체를 넘겨줄 수 없습니다.

+[추가] 또한 사용 사례에도 차이가 있습니다. 필터는 기본적으로 스프링과 무관하게 전역적으로 처리해야하는 작업들을 처리할 수 있습니다. 따라서 필터는 인터셉터보다 앞단에서 동작하기 때문에 보안 검사를 하여 올바른 요청이 아닐 경우 차단할 수 있습니다. 그러면 스프링 컨테이너까지 요청이 전달되지 못하고 차단되므로 안정성을 더욱 높일 수 있습니다. 또한 필터는 이미지나 데이터의 압축, 문자열 인코딩과 같이 웹 어플리케이션에 전반적으로 사용되는 기능을 구현하기에 적당합니다. 반면 인터셉터는 클라이언트의 요청과 관련되어 전역적으로 처리해야하는 작업들을 처리할 수 있습니다. 또한 인터셉터는 필터와 다르게 객체 자체를 조작할 수 없습니다. 대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이합니다.

study

  • POJO가 무엇인지 설명해주시고, 특징과 장점에 대해서도 설명해주세요.
  • VO, BO, DAO, DTO에 대해 설명해주세요
    • DAO(Data Access Object) : DB의 데이터에 접근을 위한 객체를 말합니다. 데이터베이스에 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용되며 데이터베이스를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체를 말합니다.(Repository 또는 Mapper에 해당)
    • BO(Business Object) : 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체를 말합니다.(Service에 해당)
    • DTO(Data Transfer Object) : 각 계층간의 데이터 교환을 위한 자바 Beans를 말합니다. 여기서 말하는 계층은 Controller, View, Business Layer, Persistent Layer를 말합니다.
    • VO(Value Object) : 실제 데이터만을 저장하는 객체를 말합니다.
    • DTO와 VO의 차이점 : DTO는 데이터 전송만을 위한 객체이고, VO는 특정한 비즈니스 로직을 가질 수 있습니다. 따라서 DTO는 데이터 전달만을 목적으로 하고, VO는 객체 자체를 어떠한 value로서 사용합니다. 즉, 외부 시스템과 데이터 통신을 할 경우 DTO로, DB에서 가져오는 Data는 VO로 정의 후 사용합니다. 또한 DTO는 목적 자체가 데이터의 전달이므로, 읽고 쓰는 것이 모두 가능해 가변성을 갖고, VO는 불변성 및 read-only 속성을 가집니다.
    • Entity란? Entity 클래스는 실제 DataBase의 테이블과 1:1로 매핑되는 클래스로, DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야합니다.
  • Spring MVC에 대해 설명해주세요
  • Spring Framework에 대해 설명해주세요
  • 관점 지향 프로그래밍(AOP)에 대해 설명해주세요.


  • DI(Dependency Injection)에 대해 설명해주세요
    Dependency Injection의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 스프링의 IoC 컨테이너의 구체적 구현 방식을 말합니다. DI는 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것을 말합니다. 객체는 직접 의존하고 있는 객체를 생성하거나 검색할 필요가 없으므로 코드 관리가 쉬워지고 코드의 재사용성을 높일 수 있습니다.
  • ORM에 대해 설명해주세요
    Object-Relational Mapping 즉, 객체와 관계형 데이터베이스 매핑의 줄임말입니다. 우리가 OOP에서 쓰는 객체라는 개념을 구현한 클래스에서 쓰이는 데이터인 테이블을 매핑(연결)하는 것을 의미합니다.
  • JPA(Java Persistent API)에 대해 설명해주세요
    자바 ORM 기술에 대한 API 표준 명세를 의미합니다. JPA는 특정 기능을 하는 라이브러리가 아니고, ORM을 사용하기 위한 인터페이스를 모아둔 것입니다. JPA는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야하는 지를 정의하는 방법 중 하나입니다. JPA를 사용하기 위해서는 JPA를 구현한 Hibernate 같은 ORM프레임워크를 사용해야합니다. Hibernate를 많이 사용하는 이유는 가장 범용적으로 다양한 기능을 제공하기 때문입니다.
  • ORM, JPA, Hibernate의 장단점에 대해 설명해주세요
    JPA는 자바의 ORM 기술 표준으로 인터페이스의 모음입니다. 이러한 JPA 표준 명세를 구현한 구현체가 바로 Hibernate입니다.
    ORM : 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 도와주며 재사용 및 유지보수의 편리성이 증가합니다. 또한 DBMS에 대한 종속성도 줄어든다는 장점이 있습니다. 반면 완벽한 ORM으로만 서비스를 구현하기는 어렵습니다. 잘못 구현된 경우 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있습니다. 그리고 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵습니다.
    Hibernate : SQL을 사용하지 않고 직관적인 코드를 사용해 데이터를 조작할 수 있습니다. 즉, 반복적인 SQL 작업과 CRUD 작업을 직접 하지 않으므로 생산성이 매우 높아집니다. 또한 테이블 컬럼이 변경되었을 경우, JPA가 관련 DAO의 파라미터, 결과, SQL등을 모두 확인하여 수정하는 일들을 대신 해주기 때문에 유지보수 측면에 좋고 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다는 장점도 있습니다. 마지막으로 여러 DB 벤더마다 SQL 사용이 조금씩 다른데 JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않습니다. 하지만 이해하고 알아야할것이 많고 직접 SQL을 호출하는 것보다 세밀함과 성능이 떨어질 수도 있습니다.
  • IoC에 대해 설명해주세요


  • Spring AOP가 무엇인지 OOP와 AOP를 비교하여 설명해주세요.
  • Spring의 동작방식을 설명해주세요
  • SpringBoot와 SpringFramework의 차이점을 설명해주세요
  • DAO와 DTO를 설명해주세요
  • Spring을 사용하면 어떤 이점이 있는지 설명해주세요
    POJO기반의 구성으로 코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않고 Java코드를 이용해서 객체를 구성하는 방식 그대로 스프링에서 사용할 수 있습니다. 덕분에 자유롭게 객체지향적 설계를 구현할 수 있고 때문에 높은 생산성과 유연한 테스트를 할 수 있다는 장점을 가집니다. DI를 통한 객체 관계 구성으로 개발자가 POJO개발이 가능하게 합니다. AOP를 지원하여 반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에만 집중할 수 있도록 지원합니다.


  • AOP란 무엇일까요?
  • Servlet이란 무엇일까요?
    클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술입니다. Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환합니다.
    • 장점 : 복잡한 프로그램 로직 구현에 적합합니다. 컴파일 결과(.class)만 있어도 가능하므로 소스 코드르 보호할 수 있습니다.
  • Spring과 SpringBoot의 차이는 무엇일까요?
  • 프로젝트에서 사용했던 Annotation 중에 기억에 남는 것, 해당 Annotation의 역할
  • 요청이 들어왔을 때 Spring의 요청 처리 흐름을 설명해주세요


  • POJO란 무엇인가요?
  • IoC란 무엇인가요?
  • DI란 무엇인가요?
  • SpringFramework와 SpringBoot의 차이에 대해 설명해주세요
  • 스프링에서 인터셉터(interceptor)와 필터(filter)의 차이에 대해 설명해주세요


  • MVC 진행 방식에 대해서 설명해주세요
  • AOP란 무엇인지 설명해주세요
  • JWT에 대해서 설명해주세요
    • 간단하게 : 과거에 서버 기반 인증 시스템을 사용했습니다. 하지만 단점이 존재하여 단점을 극복하기 위해 토큰 기반 인증 시스템이 나왔습니다. 인증 받은 사용자에게 토큰을 발급해주고, 서버에 요청을 할 때 HTTP 헤더에 토큰을 함께 보내 인증받은 사용자인지 확인합니다. 서버 인증 시스템과 달리 사용자의 인증 정보를 서버에 저장하지 않고 클라이언트의 요청으로만 인가를 처리하므로 stateless한 구조를 가집니다. JWT는 Json Web Token의 약자로 인증에 필요한 정보를 암호화시킨 claim 기반의 웹 토큰을 뜻합니다. 세션/쿠키 방식과 유사하게 클라이언트는 Acess Token(JWT)을 HTTP 헤더에 실어 서버로 보냅니다.
    • 구체적으로 : 과거의 서버 기반 인증 시스템은 서버 측에서 사용자들의 정보를 기억하기 위해 세션을 유지하는데, 이는 메모리, 디스크, 데이터베이스 등을 통해 관리합니다. 클라이언트로부터 요청을 받으면 클라이언트의 상태 정보를 저장하여 유지해야 하므로 stateful한 구조를 가집니다. 중요한 정보는 서버에 있기 때문에 쿠키 자체(세션ID)에는 유의미한 값을 가지지 않아 안전하다는 장점이 있지만 해커가 훔친 쿠키를 이용해 HTTP 요청을 보내면 서버에서는 올바른 사용자가 보낸 요청인지 알 수 없다는 단점과 사용자가 증가함에 따라 과부하를 줄 수 있어 확장이 용이하지 못하다는 단점이 있습니다. 이를 해결하기 위해 토큰 기반 인증 시스템이 나왔는데 인증 받은 사용자에게 토큰을 발급해주고, 서버에 요청을 할 때 HTTP 헤더에 토큰을 함께 보내 인증받은 사용자인지 확인합니다. 서버 인증 시스템과 달리 사용자의 인증 정보를 서버에 저장하지 않고 클라이언트의 요청으로만 인가를 처리하므로 stateless한 구조를 가집니다. JWT는 Json Web Token의 약자로 인증에 필요한 정보를 암호화시킨 claim 기반의 웹 토큰을 뜻합니다. 세션/쿠키 방식과 유사하게 클라이언트는 Acess Token(JWT)을 HTTP 헤더에 실어 서버로 보냅니다. 서버 기반의 인증 시스템은 저장소의 관리가 필요하지만, 토큰 기반은 Access Token을 발급해준 후 요청이 들어오면 검증만 해주면 되기 때문에 추가 저장소가 필요 없다는 장점이 있습니다.(stateless) 또한 쿠키를 사용함으로 인해 발생하는 취약점이 사라지며 확장성이 뛰어나 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능합니다. 하지만 이미 발급된 JWT를 돌이킬 수 없어 유효기간이 완료될 때까지는 계속 사용이 가능하다는 부분과 JWT의 길이가 길어 서버의 자원 낭비가 발생할 수 있다는 단점이 존재합니다. JWT는 header, payload, signature로 구성되며 각 파트를 점으로 구분합니다. 헤더는 토큰의 타입과 해시 암호화 알고리즘으로 이루어져있고 내용은 토큰에 사용자가 담고자 하는 정보를 담습니다. 서명은 토큰을 인코딩하거나 유효성 검증할 때 사용하는 고유한 암호화 코드입니다. 헤더와 내용의 값을 인코딩합니다.
      • Claim 기반의 웹 토큰? 일반 토큰 기반 인증은 주로 의미가 없는 문자열(random string) 기반으로 구성되어 있으며 사용할 때는 json으로 보내는 방식을 사용합니다. 단순한 문자열이므로 정보를 담거나 할 수 없으며 발급된 토큰에 대해 만료 시킬 수단이 없고 검사하거나 처리할 때마다 DB에 접근하여 검사할 경우 부담이 생깁니다. 또한 사용자 로그아웃 등으로 인한 토큰을 관리할 방법이 없습니다. 이러한 문제를 어느정도 해결할 수 있는 것이 클레임 기반 토큰 방식입니다. 클레임이란 사용자 정보나 데이터 속성을 의미합니다. 즉 토큰 안에 여러 정보를 담고있는 토큰입니다.
  • Dispatcher Servlet란 무엇인지 설명해주세요
    모든 request를 처리하는 중심 컨트롤러입니다. 서블릿 컨테이너에서 http 프로토콜을 통해 들어오는 모든 request에 대해 제일 앞단에서 중앙집중식으로 처리해주는 핵심적인 역할을 합니다. 기존에는 web.xml에 모두 등록해줘야 했지만, Dispatcher Servlet이 모든 request를 핸들링하면서 작업을 편리하게 할 수 있습니다.
  • Spring Container란 무엇인지 설명해주세요
    객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데 이것을 Spring Container 또는 IoC 컨테이너라고합니다. 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다. 객체 관리 주체가 프레임워크 다시말해 컨테이너가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다.