웹 프로그래밍 56

[ Spring Security ] 07. 주요 아키텍쳐 : DelegatingFilterProxy & FilterChainProxy

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. Spring Security 주요 아키텍쳐 DelegatingFilterProxy Filter는 Servlet 2.3부터 제공되는 기술이다. 필터의 역할은 어떤 요청이 있을 때 이 요청이 실제로 서블릿으로 들어오는데, 서블릿 자원에 들어오기 전에 처리를 하는 곳이 필터. 요청에 대한 최종적인 접근 전, 후로 어떤 처리를 할 수 있도록 하는 기술이 필터이다. 이 필터는 서블릿 스펙에 있는 기술이기 때문에 Servlet 컨테이너에서 생성되고 실행이 되기 때문에, 필터는 Spring에서 만든 Bean을 Injection..

[ Spring Security ] 06. CSRF Filter

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. CSRF 사이트 간 요청 위조 공격 CSRF란 사용자의 의도와는 무관하게 공격자가 심어놓은 행위로, 공격자가 의도한대로 응답하는 공격이다. 그래서 Spring-Security는 이런 취약점을 방지하기 위한 API를 제공한다. CsrfFilter CSRF의 취약점을 방지하는 필터이다. 모든 요청에 랜덤하게 생성된 토큰을 HTTP 파라미터로 요구한다. 요청 시 전달되는 토큰 값과 서버에 저장된 실제 값과 비교한 후 만약 일치하지 않으면 요청은 실패한다. Client 서버의 자원에 접근할 때는 HTTP 메소드(PATCH..

[ Spring Security ] 05. 인증/인가 API의 예외처리

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. 인증/인가 API ExceptionTranslationFilter FilterSecurityInterceptor(맨 마지막에 위치)가 이를 호출한다 ExceptionTranslationFilter 필터는 아래 두가지 예외를 처리하고 있다. AuthenticationException 인증 예외 처리 AuthenticationEntryPoint 호출 로그인 페이지 이동 401 오류 코드 전달 등 인증 예외가 발생하기 전의 요청 정보를 저장 RequestCache : 사용자의 이전 요청 정보를 세션에 저장하고 이를 꺼내..

[ Spring Security ] 04. 인가 API와 표현식

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. 인가 API [ 권한설정과 표현식 ] 선언적 방식 URL http.antMatchers("/users/**").hasRole("USER") Method @PreAuthorize("hasRole('USER')") public void user() { System.out.println("user"); } 동적 방식 (DB 연동 프로그래밍) URL Method > 권한 설정 protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/..

[ Spring Security ] 03. 동시 세션제어와 세션 고정보호, 세션 정책 관리

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. [ 동시 세션 제어, 세션 고정 보호, 세션 정책 ] > 동시 세션 제어 동일한 계정으로 인증을 받을 때 생성되는 세션에 허용 개수가 초과 되었을 경우 어떻게 세션을 유지하는 지에 대한 제어를 말한다. Spring-Security에서는 두 가지 전략으로 동시세션제어를 하게 된다. default 최대 세션 허용 개수 : 1개 동일한 계정으로 들어온 사용자에 대해서 세션 허용 개수 이전 사용자 세션 만료 사용자 1의 세션은 만료 되고 사용자 2의 세션은 사용가능 하다. 현재 사용자 인증 실패 뒤늦게 들어온 사용자 2의..

[ Spring Security ] 02. 익명 사용자 인증처리 필터 : AnonymousAuthenticationFilter

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. 익명 사용자 인증처리 필터 익명 사용자와 인증 사용자를 구분해서 처리하기 위한 용도로 사용되는 필터. 화면에서 인증 여부를 구현할 때 isAnonymous() 와 isAuthenticated()로 구분해서 사용한다. (login / logout 과 같은 기능을 나누어서 처리 가능) 인증객체를 세션에 저장하지 않는다. 어떤 사용자가 인증을 받았을 때, 세션에 사용자의 유저 객체를 저장을 한다. 사용자가 어떤 자원에 접근하려고 하면 이 사용자가 저장한 유저 ..

[ Spring Security ] 01. Remember-Me 인증이란?

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. [ Remember Me 인증 ] : RememberMeAuthenticationFilter Remember-Me ? 세션이 만료되고 웹 브라우저가 종료된 이후에도 어플리케이션이 사용자를 기억하는 기능 Remember-Me 쿠키에 대한 Http 요청을 확인한 후에 토큰 기반 인증을 사용해서 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다. 사용자 Life Cycle 인증 성공(Remember-Me 쿠키 설정) 인증 실패(쿠키가 존재하면 쿠키 무효화) 로그아웃(쿠키가 존재하면 쿠키 무효화) protected ..

[ Spring Security ] 00. LoginForm 인증 API 및 Filter의 이해

인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다. [ Login 인증 ] UsernamePasswordAuthenticationFilter SecurityContext : 인증 필터가 사용자의 인증을을 가지고 있는 Context SecurityContextHolder.getContext().getAuthentication() : 어디서든 현재 어떤 인증을 받았는지 볼 수 있다. protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html")..

[ SpringBoot ] 11. ModelMapper 라이브러리 이용하기

ModelMapper 엔티티와 DTO간에 변환 시 자동으로 Object를 매핑시켜주는 라이브러리 주의: 매핑해줄 클래스에는 setter가 있어야하고 매핑이 되는 클래스에는 getter가 있어야 사용 가능하다! 기본적으로 ModelMapper에서 제공하는 map() 메서드를 이용하면 변환할 수 있고 클래스 내부에 있는 변수들의 이름을 분석해서 자동 매핑시켜주는 방식이다. 이 map() 메소드가 호출되면 source(from)와 destination(to)의 타입이 분석되고 matching strategy와 configuration에 의해서 어느 프로퍼티가 매칭될지 결정된다. 때에 따라서 매핑을 명시적으로 정의해야 하는데, ModelMapper는 다양한 매핑 접근 방식을 지원하므로 메서드와 필드참조를 혼합해..

[ Spring Data JPA ] 03. JPA IN Clause

JPA IN Clause Spring JPA Query에서 사용할 수 있는 IN 절에 대해서 살펴본다. ref : https://javadeveloperzone.com/spring/spring-jpa-query-in-clause-example/ id가 1 또는 2 또는 3인 employee에 대해 select 하는 쿼리이다. 우리는 JPA를 사용하기 위해 List나 Collection으로의 변환이 필요한데, Spring Data JPA는 IN 쿼리를 지원하는 기본 쿼리를 제공하고 있다. 그러면 실제로 어떻게 사용하는지 예시와 함께 보자. 첫 번째 방법은 메서드 이름으로 레코드를 가져오는 것이다. 예약된 이름 규칙으로 메서드를 정의하게 되면 Spring JPA가 런타임시에 자동으로 쿼리를 생성하고 결과를 ..

[ SpringBoot ] 10. DDD: 도메인주도설계

DDD: 도메인주도설계 객체지향의 핵심은 무엇일까? 객체지향에서의 핵심은 실세계의 객체(물건, 사람, 주문, .. 주도적으로 뭔가 생산할 수 있는 주체) 들이 서로간의 상호작용을 바탕으로 책임,협력,역할의 관점을 가지고 메세지를 교환하는 것이다. 객체지향의 핵심은 결국 객체(무언가를 만드는 주체)라고 할 수 있다. 그렇다면 어떤 객체가 필요한지 알 수 있고 어떻게 이 객체들을 추려내서 상호작용할 수 있을까? 이를 해결할 수 있는 것이 바로 도메인 주도 설계(DDD: Domain Driven Design)이다. 다시 말해서, 도메인을 중심으로 설계해 나가는 것이다. 도메인이란 실세계에서 사건이 발생하는 집합이라고 생각하면 쉽다. 쇼핑몰을 예로 들면, 쇼핑몰에서는 손님이 주문하는 도메인(Order Domai..

[ SpringBoot ] 09. AOP를 활용한 REST API의 Error Handling

AOP를 활용한 REST API의 Error Handling SpringBoot에서 기본적으로 오류처리에 대한 동작 흐름에 대해 알아보자. SpringBoot는 모든 오류를 적절한 방식으로 처리하며 /error로 매핑하는 전역 오류 페이지 등록을 제공한다. 또, http 상태와 예외에 대한 메시지를 JSON으로 응답하거나 html 형식으로 렌더링 하는 whitelabel 페이지 뷰를 제공한다. BasicErrorController SpringBoot의 기본 오류 처리 SpringBoot는 오류가 발생하면 server.error.path에 설정된 경로에서 요청을 처리하게 된다. 기본적으로 BasicErrorController가 등록이 되어 있어서 해당 요청을 처리하게 된다. @Controller @Requ..

[ Spring Data JPA ] 02. Transaction Commit은 어디에서 일어날까?

트랜잭션 커밋은 어디에서 일어날까? 레파지토리를 만들 때 Spring-Data-Jpa의 JpaRepository 인터페이스를 상속하였는데, 스프링 데이터에서 기본 구현체를 제공해주기 때문이다. Spring-Data-Jpa에서 제공하는 JpaRepository의 기본 구현체는 SimpleJpaRepository이다. (CrudRepository는 단순히 인터페이스이다.) SimpleJpaRepository의 save()메소드에는 스프링 @Transactional이 붙어있으므로 해당 클래스에 있는 수많은 메소드에 트랜잭션이 걸리게 되고, 메소드 성공적으로 return하게 되면 commit도 이루어지게 되는것이다. @Transactional public S save(S entity) { Assert.notNu..

[ Spring Data JPA ] 01. JpaRepository 사용하기

JpaRepository Spring-Data-Jpa에서는 반복되는 코드없이 쉽게 JPA Repository를 만들 수 있다. extends JpaRespository으로 인터페이스를 상속하고 커스텀이 필요한 메소드는 오버라이딩하면 된다. 스프링의 변경감지는 EntityManger별로 수행한다. 같은 쓰레드에서 Spring-Data가 제공하는 Repository들은 하나의 EntityManager를 공유한다. 그래서 하나의 컨테이너에서 여러 Repository가 사용하는 EntityManager는 동일하다.

[ Spring Data JPA ] 00. Entity와 EntityManager

Entity에 관하여 엔티티 클래스는 테이블과 매핑되어 사용되는 클래스이다. @Entity 어노테이션으로 JPA에게 테이블과 매핑될 클래스이니 관리 할 것임을 알리고 @Table(name = 'product')로 DB와 매핑될 테이블 네임을 지정한다. class name과 table name이 같다면 생략해도 된다. @Column(name = 'id')도 마찬가지로 DB의 컬럼과 매핑될 필드로 name이 같다면 생략해도 된다. ++ 일반적으로 id를 Long타입의 래퍼클래스로 받는 이유? : long값의 경우 기본값으로 0이 데이터베이스에 들어갈 수 있는데, 기존 데이터베이스에도 id가 0값으로 들어있다면 이게 기존데이터인지 추가된 데이터인지 구분이 어렵다. 따라서, Long타입으로 하면 null로 들어..