이전 포스팅에서 Spring Security 를 활용하지 않고 컨트롤러로 다 구현했다.이번에는 왜 Spring Security를 사용해서 OAuth를 구현해야하는지를 고려해보려고 한다.Spring Security?스프링 시큐리티는 강력하고 고도로 사용자 지정 가능한 인증 및 액세스 제어 프레임워크입니다. 스프링 기반 애플리케이션을 보호하기 위한 사실상의 표준입니다.스프링 시큐리티는 Java 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크입니다. 모든 스프링 프로젝트와 마찬가지로 스프링 시큐리티의 진정한 힘은 사용자 지정 요구 사항을 충족하기 위해 얼마나 쉽게 확장할 수 있는지에 달려 있습니다 스프링을 사용할 때 보안을 적용하고 싶다? 그럼 Spring Security를 사용해라...
OAuth(Open Authorization)OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹 사이트 상의 자신들의 정보에 대한 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준다. 구글에 로그인하면 API를 통해 연동된 계정의 Google Calender 정보를 가져와 사용자에게 보여줄 수 있다.이때 사용되는 프로토콜이 OAuth다. 더 잘 이해하기 위해 인증과 인가에 대한 개념을 구분해보자Authentication(인증): 유저 본인을 확인하는 과정(로그인)Authorization(인가): 인증 후 인가를 진행, 인가에 따라 유저 정보를 선택전으로 반환한다파티에 초대된 손님을 예로 들어보면,호스트가 파티에 입장하는 사람의..
@ComponetScan컴포넌트 스캔 실습 코드 AppConfig에서 `@Bean`으로 모두 등록해주었다. 빈으로 등록해야한게 수백만개가 된다면 일일이 등록하기 너무 귀찮고, 설정 정보도 커지게 된다.`@ComponetScan` 을 설정 정보에 붙여주면 된다.AutoAppConfig파일 구조는 다음과 같다프로젝트 최상단에 AutoappConfig.java가 있으므로 프로젝트에서 컴포넌트로 등록해준 것을 다 빈으로 등록한다.@Configuration//@ComponentScan: 스프링 빈을 다 끌어다가 자동으로 스프링 빈으로 끌어올리는..@ComponentScan( //스프링 빈 등록에서 제외할 것 excludeFilters = @ComponentScan.Filter(type =..
싱글톤 패턴애플리케이션을 개발하면 여러 고객이 동시에 요청을 보내게 된다.스프링 없이 AppConfig를 사용해서 컨테이너를 생성하게 되면 매 요청마다 객체를 생성하게 된다.고객 트래픽이 초당 100이 나오면 초당 100 개 객체가 생성되고 소멸된다. -> 메모리 낭비싱글톤 패턴을 적용한 코드는 아래와 같다.public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private static final SingletonService instance = new SingletonService(); //2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다. public static SingletonS..
스프링 컨테이너 생성자바 설정 클래스를 기반으로 스프링 컨테이너 생성할 수 있다.new AnnotationConfigApplicationContext(AppConfig.class);AnnotationConfigApplicationContext는 ApplicatinContext 인터페이스의 구현체이다.AppConfig.class 에 있는 구성 정보를 활용해서 컨테이너 생성 빈 이름빈 이름은 메서드 이름을 사용아래와 같이 빈 이름은 직접 부여할 수도 있다.@Bean(name="memberService2") 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다.자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다. 스프링 빈 조회 - 상속 관계부모 타입으로 조회하면..
제어의 역전 IoC (Inversion of Control)AppConfig에서 구현체를 생성하고 주입해주는 역할을 한다.-> 프로그램의 제어의 흐름은 AppConfig가 가져간다.OrderServiceIml 은 필요한 인터페이스들을 호출하지만 어떤 구현객체가 실행될지 모른다. 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다.해당 포스팅은 프레임워크와 라이브러리를 비교하며 제어의 역전을 설명하고 있다. 의존관계 주입 DI (Dependency Injection)의존관계는 정적 클래스 의존 관계와, 런타임에 결정되는 동적 객체(인스턴스) 의존관계 둘을 분리해서 생각해야한다.해당 포스팅에서 DI 에 대해 설명하고 있다.정적 클래스 의존 관계클래스..
역할과 구현 분리역할과 구현을 분리해서 자유롭게 구현 객체를 조립할 수 있도록 설계한 클래스 다이어그램회원을 메모리에서 조회하고, 정액 할인 정책(고정 금액)을 지원해도 주문 서비스를 변경하지 않아도 된다. public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = newMemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int item..
HttpSession and RESTful APIs스프링 공식 문서 Spring Session은 Session을 헤더로 주고 받으면서 RESTful API와 동작할 수 있다. Tomcat의 경우 SessionID를 JSESSIONID라는 키의 쿠키를 생성해서 set-cookie 헤더에 담아서 전달 Requset시 Header에 SessionId가 포함되어 절달된다면 (Cookie 헤더에 SeesionId가 전달될 것) 서블릿 컨테이너는 세션을 발급하지 않고 해당 SessionId에 해당하는 세션을 전달하게 되고, SessionId가 포함되지 않는다면 HttpSession을 요구하는 모든 요청에 대해 새로운 Session을 발급.private String createSession(HttpServletReq..
Spring SessionSpring Session 공식 문서Spring Sesison은 유저 세션 정보 관리를 위한 API와 구현체를 제공한다. Spring session 은 세션 클러스터링을 유지하도록 한다.세션 클러스터링이란?클러스터는 군집이나 무리를 뜻함두 대 이상의 WAS가 동시에 한가지 업무를 수행하도록 만드는 기술세션 클러스터링은 WAS가 두 대 이상 설치되어 있을 경우 동일한 세션으로 세션 관리하는 것을 의미동일한 세션으로 여러 WAS 서버에서 사용할 수 있다는 말 예를 들어서 설명하자면,요청이 오면 L4 스위치가 해당 사용자가 접속했던 WAS로 유도해서 사용하던 세션을 그대로 사용할 수 있도록하지만 스레드 풀이 고갈되어서 다른 WAS를 사용하게 된다면 이때 세션 불일치 문제가 발생할 수 ..