순수한 스프링 시큐리티에 jwt를 사용하여 클라이언트-서버 통신에 권한 인가(Authorization) 기능을 추가해보자. 먼저 스프링 시큐리티는 보안을 담당하는 프레임워크로, 세션 체크, auth redirect(로그인 완료시 다음화면 전환)과 같은 기능을 수행해준다. 의존성 추가 가장 먼저 jwt토큰을 만들어주는 라이브러리를 gradle에 추가해주자. //시큐리티 implementation("org.springframework.boot:spring-boot-starter-security") //jwt //implementation("io.jsonwebtoken:jjwt:0.9.1") implementation("io.jsonwebtoken:jjwt-api:0.11.5") implementation("..
세션+쿠키 로그인 일반적으로 웹에서 서버로 url을 통해 요청하면, 서버에서는 적절한 컨트롤러가 매핑하고 내부 로직등을 통과한 후 뷰(html 등)를 리턴해준다. 이 때 (세션 만료 후)최초 요청시 헤더 쿠키를 이용하여 세션 id를 발급한 후 사용자 정보도 같이 저장하고, 이후 요청마다 서버의 세션 저장소에서 쿠키의 세션id를 확인하여 자동으로 사용자 인증과 함께 세션 만료 여부도 확인한다. (https://eckrin.tistory.com/entry/Spring-MVC-%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8) JWT? 그렇다면 왜 세션 로그인 방식이 아닌, Js..
UserDetails 스프링 시큐리티에서 사용자의 정보를 담는 인터페이스이다. 하지만 대부분의 경우 기본 UserDetails 인터페이스로는 구현에 한계가 있기 때문에 다음과 같이 UserDetails를 구현하여 사용한다. 스프링 시큐리티는 로그인 요청을 가로채서 인가처리를 하는데, 기존 UserDetails 대신 그것을 구현한 객체를 저장,관리하게끔 하자. UserDetails를 구현한 객체(PrincipalDetails)를 만들고, UserDetailsService를 구현한 객체(PrincipalDetailsService)에서 그것을 저장하면 시큐리티가 커스텀한 UserDetails를 사용하여 관리해주는 것 같다. //스프링 시큐리티가 로그인 요청을 가로채서 UserDetails를 구현한 객체를 저장..
스프링 시큐리티 많은 프로젝트들이 기본적인 회원 관리를 필요로 하고 있고, 그것을 위해서 보안에 관련된 다양한 처리가 필요하다. 스프링은 spring security라는 하위 프레임워크에서 인증(Authentication)과 인가(Authorization)에 관련된 다양한 기능을 제공하고 있다. 인증(Authentication): 접근하려는 유저에 대한 확인 절차 (login, join..) 인가(Authorization): 인증된 사용자에 대해서 권한을 관리하는 것 접근주체(Principal): 보호 대상에 접근하려는 유저 비밀번호(Credential): 대상에 접근하려는 유저의 비밀번호 스프링 시큐리티 동작 원리 스프링 시큐리티는 이러한 인증과 인가를 위하여 Principal(=username)과 C..
개념 빈 스코프란 스프링 빈이 존재할 수 있는 범위를 이야기한다. 스프링은 다음과 같은 다양한 스코프들을 지원한다. 싱글톤 : 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 기본 스코프이다. 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하는 짧은 범위의 스코프이다. request : 웹 요청이 들어오고 나갈때까지 유지되는 스코프이다. session : 웹 세션이 생성되고 종료될때까지 유지되는 스코프이다. 싱글톤 (Singleton) @Scope("singleton") 싱글톤 스코프란 앞서 공부했듯이 어플리케이션 전반에 걸쳐 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 방법이다. 자바상의 싱글톤 패턴은 여러가지 단점을 가져오기도 하지만 스프링은 그러한..
@Autowired를 이용해서 조회하면, 이것은 getBean메소드를 이용해서 타입 조회하는것과 유사하게 동작한다. 그런데 선택된 빈이 2개 이상일 경우 getBean메소드와 동일하게 @Autowired도 NoUniqueBeanDefinitionException에러를 발생시킨다. 아래 코드를 보자. @Autowired private DiscountPolicy discountPolicy; //이때 DiscountPolicy메소드를 //RateDiscountPolicy와 FixDiscountPolicy라는 두 개의 클래스가 상속받고 있다고 하자. @Component public class FixDiscountPolicy implements DiscountPolicy() {...} @Component publ..
Ioc (Inversion of Control) 간단하게 말하면, 사용자의 new 선언을 방지하고, 모든 레퍼런스 변수, 관계설정, 제거, 사용까지 오브젝트(스프링 빈) 전반에 걸친 모든 과정을 프레임워크의 컨테이너(스프링 컨테이너)에게 위임하는 것. 이를 통해서 객체는 프레임워크가 관리하고, 사용자가 구현부를 관리함으로서 응집도를 높이고 결합도를 낮추며, 싱글톤 패턴을 유지할 수도 있다. 스프링은 패키지에서 스프링 빈으로 등록된 모든 메소드의 리턴값을 스캔(컴포넌트 스캔)하여 객체들을 관리하고, 의존관계를 주입해준다. 즉 스프링에서 말하는 DI는 객체 합성+객체를 관리할 컨테이너 패턴+IoC를 사용하는 스프링 프레임워크의 특징이라고 할 수 있다. 스프링에서 사용하는 IoC를 DI라고 하며, DI 말고..
EntityManagerFactory emf = Persistence.createEntityManagerFactory("project"); EntityManager em = emf.createEntityManager(); jpa에서 Entitymanagerfactory를 통해서 Entitymanager를 뽑아쓰는것과 다르게, 스프링에서는 스프링부트가 @PersistenceContext어노테이션만 달아주면 바로 EntityManager를 사용할 수 있게 해준다. @PersistenceContext EntityManager em; @Autowired가 스프링 빈을 주입한다면, @PersistenceContext는 영속성 콘텍스트를 주입하는 jpa 어노테이션이다. 이때 @PersistenceContext 대신..
개요 스프링을 이용하는 웹 애플리케이션의 경우 일반적으로 여러 클라이언트의 요청이 동시에 이루어진다. 그런데 싱글톤 방식을 사용하지 않는 컨테이너의 경우 고객의 요청이 올 때마다 객체를 새로 생성해야 한다. 이 대신 객체를 단 1개만 생성하고 공유하도록 하면 자원 낭비를 줄일 수 있다. 싱글톤 패턴 클래스의 인스턴스가 단 한개만 생성되도록 하는 디자인 패턴이다. 결국 한 개의 객체를 공유하도록 만들어 주어야 하는데, 이를 위해서 1. private static final 객체를 1개 생성후 static메서드를 통해서만 조회하게 한다. 2. 생성자는 private로 선언해서 외부에서 new키워드를 사용하지 못하게 한다. 와 같은 방법을 사용할 수 있다. static메서드를 통해서만 조회하도록만을 제한해도,..
프레임워크 vs 라이브러리 내가 작성한 코드를 제어하고, 대신 실행한다면(IoC) 그것은 프레임워크이고, 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리이다.스프링을 사용함으로서 범용의 프레임워크를 이용해서 개발을 진행할 수 있다. 스프링 컨테이너 ApplicationContext를 스프링 컨테이너라고 한다.스프링 컨테이너는 @Configuration 어노테이션이 붙은 AppConfig 전달받아 설정정보로 사용한다. 이때 @Bean이라 명시된 메소드를 모두 호출해서 반환된 객체를 메소드명으로 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.//스프링 컨테이너를 애노테이션 기반의 자바 설정 클래스로 설정ApplicationContext ac = n..