본문 바로가기

Spring132

PSA(Portable Service Abstraction) 이란? PSA 는 한마디로 잘만든 인터페이스 라고 정의할 수 있다. 스프링을 사용하면 서비스 추상화를 통해 특정 환경이나 서버, 기술에 종속되지 않으며 유연한 애플리케이션 개발을 할 수 있다. 스프링에서는 추상화 계층을 통해 구체적인 기술과 환경에 종속되지 않도록 한다. 따라서, 추상화 계층을 사용해서 어떤 기술을 내에 숨기고 개발자에게 편의성을 제공해준다. 예로, ORM(객체 관계매핑) 이 새롭게 등장했을 때, ORM 기술을 사용하고 싶었다면, ORM 프레임워크 중 하나인 Hibernate를 사용해야 한다. 객체가 Hibernate 에 직접 의존하는 순간 기술에 종속적으로 되기 때문에, POJO 라고 할 수 없다. 스프링이 POJO를 유지하면서 Hibernate 를 사용할 수 있는 이유는 PSA 를 적용했기 .. 2022. 10. 28.
AOP 란 무엇인가? + 예제 AOP(관점지향 프로그래밍) 를 간단히 설명하면 공통 처리 등의 '횡단적 관심사(부가기능)'를 추출하고 프로그램의 여러 곳에서 호출할 수 있게 설정함으로써 개발자는 실현해야할 기능인 '중심적 관심사'에만 집중하도록 해주는 것이다. AOP 는 내부적으로 아래와 같이 동작한다. 1. 다이나믹 프록시 객체의 생성 요청 2. 포인트컷을 통해 부가 기능 대상 여부 확인 -> 어디다가 적용할 건지 3. 어드바이스로 부가 기능 적용 4. 실제 기능 처리 AspectJ 라는 AOP 외의 기술이 있다. AspectJ 는 프록시를 이용하지 않았으며 CGLib 이라는 바이트 조작 라이브러리를 사용한다. 타깃 객체의 바이트를 고쳐서 부가기능을 직접 넣어주는 방법이다. 따라서 코드를 분리하지 않는다. 프록시를 사용하지 않고 복.. 2022. 10. 26.
DI 의존성 주입 방법에 대해 알아보자 먼저 의존성이란 무엇인지 알아보자. 사용하는 객체 A 와 사용되는 객체 B 가 있다고 예를 들어본다. 아래는 new 키워드를 사용하는 예시이다. 더보기 A는 B 를 사용하기 위해 new 키워드를 이용해 생성하고 B 의 메서드를 사용한다. ( DI 컨테이너에서는 new 키워드를 사용하지 않고, 스프링 프레임워크가 대신한다 ) 아래와 같은 형태를 A 는 B 에 의존한다 라고 한다. class A { B b = new B(); b.methodX(); } 위의 상황에서 설계가 변경되어서 B 클래스에서 C 클래스로 변경하고, methodY 를 호출해야한다고 하면 아래와 같이 코드를 변경해야 한다. class A { C c = new C(); c.methodY(); } 이러한 방식으로 설계가 변경된다면 10군데든 .. 2022. 10. 26.
Ioc(Inversion of Control) 제어의 역전이란? IoC ( Inversion of Control ) 제어의 역전 의 의미 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다라는 의미이다. 이전에는 개발자가 직접 객체를 생성하고 관리해 프로그램의 제어의 흐름을 스스로 관리했다. IoC 는 왜 필요할까? 결합도를 낮춰서, 변경에 유연한 코드를 작성할 수 있는 구조를 만들 수 있다. 스프링에서도 IoC 기능을 할 수 있는 IoC 컨테이너(=스프링컨테이너, DI컨테이너, ApplicationContext)를 제공한다. IoC 컨테이너에서 관리되는 객체를 Bean 이라고 부른다. 객체의 생성을 책임지며, 의존성을 관리한다. 개발자들이 객체를 직접 생성할 수 있지만, 컨테이너에게 역할을 위임한다. 스프링에서의 객체 생성 및 실행되는 순서는 아래.. 2022. 10. 26.
@Bean 과 @Component 비교 스프링 MVC 에서 사용하는 @Controller , @Service , @Repository 등 빈으로 등록하는 방법을 계속 써왔으나, 스프링시큐리티를 공부하면서 @Configuration 과 @Bean , @Component를 사용하면서 어떤 상황에 구분해 사용해야 하나 궁금했다. 미리 알아보면 아래와 같다. Bean Component 메소드에 적용 클래스에 적용 개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용 클래스 자체를 빈으로 등록하고 싶을 때 @Configuration 안에서 @Bean으로 등록한 메서드만 유연하게 등록하고 싶을 때 스프링은 개발의 제어권이 스프링 컨테이너(Ioc 컨테이너)에 있다. 제어권이 개발자가 아닌 스프링에 있는것을 I.. 2022. 10. 24.
SpringSecurity 와 JWT 의 구조, 동작 과정 인증 : 해당 사용자가 본인이 맞는지 확인 인가 : 인증된 사용자가 요청한 자원에 접근 가능한지 권한 확인 Principal (접근주체) : 보호받는 Resource 에 접근하는 대상 Credential (비밀번호) :Resource 에 접근하는 대상의 비밀번호 인증 -> 인증 성공 후 -> 인가 인증과 인가를 위해 principal 을 아이디로, Credential 을 비밀번호로 사용한다. 스프링 시큐리티의 구조 1. AuthenticationFilter 에서 Http 요청을 받는다. 2. 해당 부분에서는 request 로 부터 username, password 를 가지고 와서 UsernamePasswordAuthenticationToken을 생성한다. 3. 생성된 UsernamePasswordAuth.. 2022. 10. 23.
SpringSecurity DB 없이 테스트 방법 1. 기본인증 -> 처음 애플리케이션 시작하면 콘솔에 있는 랜덤 비밀번호 사용 Id : user (고정) password : 콘솔창 확인 2. yml에 사용자 추가하기 application.yml 에 사용자 추가하기 spring: security: user: name: user1 password: 1234 roles: USER 3. UserDetailsService 서비스 빈을 추가하기 USER , ADMIN 으로 테스트하기 위해서는 yml 에 추가하는 것으로는 불가능 서비스빈을 사용해 여러명을 등록 설정추가 ( @Configuration , @Bean 사용 ) @Configuration //설정 정보를 추가해준다 public class SecurityRoleTest { @Bean // 스프링 컨테이너에.. 2022. 10. 20.
JWT (Json Web Token) 의 개념 JWT 는 당사자간의 정보를 JSON 객체로 안전하게 전송하기 위한 방법이다. 헤더 - Header 어떤 알고리즘이 사용되었는지 유형은 무엇인지 확인할 수 있다. 헤더에 있는 알고리즘으로 Signature에서 사용한다. 알고리즘은 SHA256 또는 RSA 를 대중적으로 사용한다. RSA 는 비대칭키 암호화 방식을 사용해 잠금한다. 공식홈페이지 예시로는 HS256 알고리즘을 사용하며, 유형은 JWT 라는 것을 알 수 있다. 페이로드 - Payload 민감한 정보를 담으면안된다. JWT 를 가지고 디코딩을 하면 해당 값을 모두 알 수 있기 때문이다. 클레임을 포함하고 있다 클레임이란 사용자 및 추가 데이터에 대한 설명을 의미한다. 구성된 페이로드는 Base64Url로 인코딩된다. 클레임은 3가지로 나뉜다. .. 2022. 10. 19.
세션(서버) 기반 VS 토큰 기반 차이 인증 (Authentication) : 사용자가 맞는지 확인 -> 로그인 인가 (Authorization) : 권한부여 -> 자신이 작성한 글 확인 등 ( 인증 이후 ) 1. 세션기반 인증 세션 기반 인증은 서버 기반의 인증방식이다. 따라서 서버 측에서 사용자들의 정보를 기억하고 있어야 하므로 stateful 한 구조를 갖는다. 사용자들의 정보를 기억하기 위해서는 사용자의 정보를 메모리에 저장한다. 클라이언트는 쿠키저장소에 서버로부터 받은 SessionID 를 저장한다. 장점으로는, 토큰방식처럼 signiture 등등 부가적인 정보가 없기 때문에, 주고받는 데이터가 적다 단점으로는, 서버에서 직접 정보를 저장하기 때문에, 정보를 저장하는데 한계가 있다. 하드디스크나 DB에 저장하기에는 작업이 느리고, 무.. 2022. 10. 19.