이번글에서는 Sleuth를 사용할 때 불필요하게 생성되는 Mesage Header 정보를 Remove 하는 방법에 대해 알아보겠습니다. Spring Cloud Slueth sleuth는 MSA 환경에서 분산된 micro service 의 추적을 용이하게 해주는 라이브러리로.. traceId & spanId 와 같은 추적 정보를 MDC 에 자동으로 Inject 해줌으로써 분산되어 있는 Micro Service 내의 전체적인 Call Stack 을 손쉽게 추적할 수 있도록 도와줍니다. slueth 에 대한 자세한 내용은 이곳을 참고하시길 바랍니다. 이때 주의점으로는 만약 slueth 를 사용하는 서비스에서 message 를 produce 하게 된다면 'TracingChannelInterceptor&#..
이번글에서는 Spring Cloud Stream 을 사용할 때 Multiple Binder 를 사용하는 방법에 대해 알아보겠습니다. 1. RabbitMQ Bindings & Binders 먼저 Bindings 와 Binders 에 대해 간단히 살펴보겠습니다. 일반적으로 rabbitMQ binder(message broker)를 한개만 사용할 경우의 config 설정이 다음과 같을 때 spring cloud: stream: bindings: "like.event": destination: like.event.exchange contentType: application/json binder: rabbit-like binders: rabbit-like: type: rabbit environment: sprin..
이번글에서는 API 에서 Json 과 MultipartFile 을 한번에 전달받는 방법에 대해 알아보겠습니다. @RequestBody 먼저 API 규격상 다음의 값들을 한번에 전달받아야 한다고 가정하겠습니다. 1. 이름 2. 나이 3. 이미지 일반적인 경우 API 에서 클라이언트에게 값을 전달받기 위해선 Request Vo 를 생성해 @RequestBody 로 데이터를 전달받도록 구현합니다. 따라서 심플하게 생각하면.. 다음과 같은 vo 를 생성해 String/Long 값과 MultipartFile 형태의 값을 한번에 전달받으면 되겠군? 이라고 생각할 수 있습니다. @Getter @ToString public class CharacterCreateRequest { private String name; p..
이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다. # 목차 1. 스프링 부트 프로젝트 생성 & 실행 - EP01 2. Controller 생성 & API 호출 (1) - EP02 3. Controller 생성 & API 호출 (2) - EP03 DispatcherServlet 이전글에 이어 다음으로 살펴볼 클래스는 DispatcherServlet 입니다. 앞단에서 HTTP request 에 대한 여러 Filter 처리가 완료된 후에는 DispatcherServlet 이 호출되어 실제로 해당 request 에 mapping 된 method 를 호출하게 됩니다. 위 Debugger Stack 상으로는 HttpServlet 이라고 표기되어 있지만. DispatcherServ..
이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다. # 목차 1. 스프링 부트 프로젝트 생성 & 실행 - EP01 2. Controller 생성 & API 호출 (1) - EP02 3. Controller 생성 & API 호출 (2) - EP03 Controller 생성 이제 Contoller 를 하나 생성해보도록 하겠습니다. 프로젝트 경로 밑에 web 이라는 폴더를 생성하고 다음과 같이 HelloController 클래스를 생성합니다. 생성한 HelloController 클래스 상단에는.. 이 클래스가 RestController 의 역할을 한다는 걸 명시하기 위해 @RestController 어노테이션을 작성해줍니다. @RestController 어노테이션은 @Cont..
이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다. # 목차 1. 스프링 부트 프로젝트 생성 & 실행 - EP01 스프링 프로젝트 생성 먼저 스프링 부트 프로젝트를 생성하기 위해 IntelliJ IDE 에서 Spring Initializr 를 사용하겠습니다. IntelliJ 좌측 상단의 File > New > Project 를 클릭 후 좌측의 Spring Initializr 및 SDK 를 선택한 후 Next 를 클릭합니다. 다음으로 Group 및 Artifact 를 입력합니다. Group 은 일반적으로 도메인 명을 역순으로 입력합니다. 예를 들어 naver 의 경우 com.naver 와 같이 입력합니다. Artifact 는 프로젝트의 이름을 적어주면 됩니다. 저는 간단히..
13. Custom Classes for OAuth2 Authentication OAuth2 Authentication을 위해 사용하는 custom classes는 다음과 같습니다. 13-1) HttpCookieOAuth2AuthorizationRequestRepository HttpCookieOAuth2AuthorizationRequestRepository는 authorization request를 cookie에 save 및 retireve 하기위해 사용됩니다. HttpCookieOAuth2AuthorizationRequestRepository @Component public class HttpCookieOAuth2AuthorizationRequestRepository implements Authori..
11. Security Configuration 다음으로 Security Configuration을 생성하겠습니다. SecurityConfig @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( securedEnabled = true, jsr250Enabled = true, prePostEnabled = true ) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailsService customUserDetailsService; @Autowired private CustomOAuth2UserService custom..
이번 글에서는 Spring Boot App에서 Spring Security와 JWT를 사용해 Goolgle Login 기능을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. Intro 이번글의 모든 내용은 이 글을 참고하였습니다. 😎 저는.. 위의 글을 읽으면서 전체 프로젝트의 구조를 이해하고, 내용을 이해하는데 굉장히 오랜시간이 걸렸습니다. Spring Security 시리즈를 작성하게된 이유도, Google Login의 흐름을 이해하기 위해서 입니다. 😅 물론, 아직도 이해가 안되는 부분이 있지만.. 혹시 포트폴리오를 위해 구글/네이버 로그인 등을 적용하시려거든, 반드시 Spring Security가 어떻게 작동하는 것인지 먼저 학습하시는 것을 추천드립니다. 2. Project Structure 먼..
이번 글에서는 Spring Boot App에서 JWT를 사용해 Authenticaiton과 Authorization을 수행하는 방법에 대해 알아보도록 하겠습니다. 1. JWT JWT에 관한 내용은 이글을 참고하시길 바랍니다. 이번글에서는 하나의 Spring Boot App에서 Authenticatoin과 Authorization을 같이 수행하도록 하겠습니다. 1-1) sample application 이번글에서 사용할 RestController는 다음과 같습니다. JWT는 주로 API Server에 사용되므로, View 단은 다루지 않겠습니다. Rest API @RestController @RequestMapping("api/public") @RequiredArgsConstructor @CrossOrig..
이번 글에서는 Thymeleaf와 Spring Security를 Integeration하는 방법에 대해 알아보도록 하겠습니다. 1. Consider Security & View 이번글에서는 이전글에서 Thymeleaf로 작성한 page에 spring security를 integration 해보도록 하겠습니다. 실제 서비스되는 어플리케이션에서는 다음과 같이 security를 고려한 view를 작성할 수 있습니다. • 로그인/비로그인 사용자 별로 show/hide 할 content를 구분합니다. • ROLE/Permission 별로 show/hide 할 content를 구분합니다. • 로그인한 사용자의 이름/permissions을 display합니다. 2. Thymeleaf Integeration 위와 같은..
이번 글에서는 Form Authentication을 customize 하는 방법에 대해 알아보도록 하겠습니다. 1. Default Parameter 이번글에서는 이전글에 적용했던 Form Authentication의 defualt parameter를 customize 해보도록 하겠습니다. 이전에 사용한 spring security의 form authentication default parameter는 다음과 같습니다. • /login • username • password • remember-me 이를 아래와 같이 변경해보도록 하겠습니다. • /signin • txtUsername • txtPassword • checkRememberMe 2. Customize Login Page 먼저 기존 login p..
이번 글에서는 Spring Boot App에 Form Authentication을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. Form Authentication 이번에는 이전글에서 생성한 spring boot app에 Form Authentication을 적용해보겠습니다. 이전까지는 사용자가 로그인할때 위와 같이 브라우저에서 직접 로그인창을 띄워 아이디와 비밀번호를 입력했습니다. 이러한 인증 방법을 Http Basic Authentication이라고하며, 이를 사용하기위해 위와 같이 SecurityConfiguration에 httpBasic( )을 정의했습니다. 이번에는 이를 개선해 Thymeleaf로 Login Page를 직접 만들어서 인증을 구현해보겠습니다. 2. Form Login Page ..
이번 글에서는 Spring Boot App에 Database Authentication을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. Database Authentication 이번에는 이전글에서 생성한 spring boot app에 Database Authentication을 적용해보겠습니다. 이전글에서는 아래와 같이 WebSecurityConfigurerAdapter를 상속한 SecurityConfiguration에 InMemory Authentication에 사용할 유저 정보를 일일이 입력해두었습니다. SecurityConfiguriaton @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception..
이번 글에서는 Spring Boot App에 SSL/HTTPS를 적용하는 방법에 대해 알아보도록 하겠습니다. 1. SSL/HTTPS SSL/HTTPS 개념은 이 글에서 확인하시길 바랍니다. 😎 Spring Boot App에 SSL/HTTPS를 적용하기위해선 아래와 같은 절차를 수행하게 됩니다. 순서대로 살펴보겠습니다. • Get SSL Certificate • Modify application.yml • Add ServletWebServerFactory as @Bean 1-1) get SSL certificate 저는 Self Signed SSL Certificate를 사용하겠습니다. 먼저 윈도우 기준으로 cmd 창을 관리자 권한으로 열어 jdk의 bin directory로 이동합니다. 다음으로 아래의 ..
이번 글에서는 Spring Boot App에 Authority Based Authorization을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. Authority Based Authorization 이번에는 이전글에서 생성한 spring boot app에 Authority Based Authorization을 적용해보겠습니다. authority based authorization을 사용하면, role based 보다 세분화하여 사용자들의 접근을 제한할 수 있습니다. 실제로 application을 운영할때에는 대부분 authority base로 authorization을 수행합니다. 간단히 Role은 여러개의 authority가 조합된 덩어리라고 생각할 수 있습니다. 😎 1-1) overall 아래와..
이번 글에서는 Spring Boot App에 Role Based Authorization을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. Role Based Authorization 이번에는 이전글에서 생성한 spring boot app에 Role Based Authorization을 적용해보겠습니다. 앞서 생성했던 app에서는 사용자의 ROLE에 관계없이 모든 resource에 접근이 가능했습니다. 하지만, 실제 운영 환경에서는 사용자의 ROLE 별로 접근 가능한 resource가 달라야 하므로 이를 적용해보도록 하겠습니다. 1-1) overall 아래와 같이 SecurityConfiguration를 변경합니다. SecurityConfiguration @Configuration @EnableWebS..
이번 글에서는 Spring Boot App에 HTTP Basic Authentication을 적용하는 방법에 대해 알아보도록 하겠습니다. 1. HTTP Basic Authentication 이번에는 이전글에서 생성한 spring boot app에 HTTP Basic Authentication을 적용해보도록 하겠습니다. 1-1) overall HTTP Basic Authentciation은 spring-security에서 제공해주는 default configuartion이 아니므로, 사용자가 직접 아래와 같이 custom security configuration을 생성해야 합니다. SecurityConfiguration @Configuration @EnableWebSecurity public class S..
이번글에서는 Spring Security의 Default Configuartion에 대해 알아보도록 하겠습니다. 1. Unsecured Spring Boot App 이번글에서 사용한 source code는 여기에서 확인할 수 있습니다. 먼저 현재 프로젝트의 구조는 다음과 같습니다. 1-1) dependency build.gradle plugins { id 'org.springframework.boot' version '2.2.5.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' } group = 'com.tutorial' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1..
이번글에서는 SSL과 HTTPS에 대해 알아보도록 하겠습니다. 1. SSL & HTTPS HTTPS란 기존의 HTTP 프로토콜에 SSL이라는 Security Layer를 한층 올린 통신 프로토콜입니다. 따라서 기본적인 통신 원리는 기존의 HTTP와 동일하며, endpoints 간에 data를 주고받을때 secure하게 data를 주고받는다는 점이 다릅니다. 1-1) http 기존의 http는 보안상의 문제점이 존재했습니다. 😅 예를 들어 위와 같이 두 endpoints 간의 credentails한 data를 transfer 하는 경우, 악의적인 공격자가 해당 data를 탈취해 악용할 가능성이 존재했습니다. 1-2) https 따라서 이를 개선하기 위해 https가 등장하게 되었습니다. 😎 https는 e..