이번 글에서는 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..
이번글에서는 Spring Security의 JWT Authentication에 대해 알아보도록 하겠습니다. 1. JWT Authentication이란? digitally signed된 token을 전달해 사용자를 인증하는 방식입니다. 이때 사용되는 token을 JSON Web Token(JWT)이라고 하며, 이는 apps 간의 data를 transmit하는데 compact하고 safe한 방법을 제공합니다. 1-1) login process login process는 다음과 같습니다. • client는 Auth Server에 로그인을 합니다. 이때 Auth Server는 application server 내에 위치할 수도 있으며, facebook, goole과 같은 제 3자가 될 수 도 있습니다. • Au..
이번글에서는 Spring Security의 Form Based Authentication에 대해 알아보도록 하겠습니다. 1. Form Based Authentication이란? web application이 작성한 HTML 페이지에 credentails 정보를 입력해 사용자를 인증하는 방식입니다. HTTP Basic Auth와 달리 사용자가 입력한 credential data는 POST 방식으로 web server에 전달되며, 전달된 form data를 사용해 인증을 구현하는 mechanism은 web application이 responsible을 가지게됩니다. 1-1) login process login process는 다음과 같습니다. • cleint가 접근이 제한된 GET /home request를..
이번글에서는 Spring Security의 HTTP Basic Authentication에 대해 알아보도록 하겠습니다. 1. HTTP Basic Authentication이란? 특정 resource에 대한 접근을 요청할때 브라우저가 사용자에게 username과 password를 확인해 인가를 제한하는 방법입니다. 1-1) process 전체적인 process는 아래와 같습니다. • 접근이 제한된 GET /home request를 client가 요청합니다. • server는 401 Unauthorized 에러와 함께, username과 password를 요청합니다. • browser는 사용자에게 username과 password를 입력받아 다시 동일한 GET /home resource를 요청합니다. • 이..
이번글에서는 Spring Security의 Authorities와 Role에 대해 알아보도록 하겠습니다. 1. Authorities & Role Srping Security에서 Authorities와 Role은 인가된 사용자들에게 부여된 권한들을 표현하는데 사용됩니다. 차이점으로는 Authorities는 기능 단위의 permission을 의미하며 작명 규칙은 따로 존재하지 않습니다. 반면 Role은 여러 Authorities를 포함할 수 있는 포괄적인 permission을 가지며, 반드시 prefix에 'ROLE_'을 명시해야하는 작명규칙을 가집니다. 그림으로 살펴보면 아래와 같이 표현할 수 있습니다. 참고 자료 : https://www.youtube.com/playlist?list=PLV..
이번글에서는 Nginx의 Load Balancer를 사용해 traffic을 분산시키는 방법에 대해 알아보도록 하겠습니다. 1. Load Balancer란? multiple client의 request를 multiple server에 distribute해 각 서버별 load를 분산시키는 기능입니다. 만약 load balancer에 연결된 server 중 특정 server가 down 되는 경우, 해당 server로의 traffic을 가용한 server로 redirect 합니다. (redundancy) load balancer는 이전 글에서 살펴본 reverse proxy와 함께 사용됩니다. 😎 2. Setting Load Balancer Nginx에 load balancer를 적용해보겠습니다. 먼저, 아래와..
이번글에서는 Nginx의 reverse proxy에 대해 알아보도록 하겠습니다. 1. Reverse Proxy란? Nginx가 클라이언트로부터 전달받은 요청을 어플리케이션 서버에 전달한 뒤, 어플리케이션 서버가 반환한 결과값을 다시 클라이언트에게 전달하는 방법입니다. 이를 통해 클라이언트는 모든 reqeust의 요청과 응답을 어플리케이션 서버가 아닌 Nginx를 통해 수행하게 됩니다. 2. Setting Reverse Proxy 이번글에서는 nginx와 php 서버를 사용해 Reverse Proxy를 구성해보도록 하겠습니다. 이번글에서 사용할 nginx.conf는 다음과 같습니다. nginx.conf events {} http { server { listen 80; location / { return 2..
이번글에서는 Let's Encrypt를 사용해 Nginx에 무료로 SSL 인증서를 설치하는 방법에 대해 알아보도록 하겠습니다. 1. Let's Encrypt란? 보안 웹사이트를 위한 인증서의 수동 생성, 유효성 확인, 디지털 서명, 설치, 갱신 등 종전의 복잡한 과정을 없애주는 자동화된 프로세스를 통해 전송 계층 보안(TLS) 암호화를 위해 무료 X.509 인증서를 제공하는 인증 기관입니다. (https://ko.wikipedia.org/wiki/Let's_Encrypt) 이 프로젝트는 SSL 인증서의 비용으로 인해 HTTPS 적용을 망설이는 사용자들에게 SSL 인증서를 무료로 발급해 HTTPS를 널리 보급하기위해 시작되었습니다. URL : https://letsencrypt.org/ko/ Let's E..
이번글에서는 nginx의 보안성을 강화할 수 있는 몇가지 방법에 대해 알아보도록 하겠습니다. 1. Hardening Nginx response data에 nginx의 version을 숨기는 방법입니다. nginx은 지속적으로 관리되고 업데이트되는 오픈소스 프로젝트입니다. 따라서 주기적으로 이전 버전에 대한 bug fix및 보안이슈 등을 개선하며, 해당 내용을 http://nginx.org/ 에 게시하고 있습니다. 하지만 만약 nginx server의 보안 취약점이 발견됬음에도 불구하고 최신 version으로 업데이트 하지 않았다면, 악의적인 공격자들은 이전 version의 보안구멍을 이용해 공격을 시도할 수 있습니다. 따라서 nginx 관리자는 주기적으로 nginx의 version을 최신화할뿐만아니라, ..
이번글에서는 nginx의 basic auth를 사용해 인가된 사용자에게만 접근을 허용하는 방법에 대해 알아보도록 하겠습니다. 1. Basic Auth란? nginx에서 가장 손쉽게 사용자 접근을 제한하는 방법입니다. 만약, 일반 사용자들에게는 접근을 허용하지 않아야되는 url가 있다면 basic auth를 사용해 손쉽게 인가되지 않은 사용자들의 접근을 제한할 수 있습니다. 2. .htpasswd nginx에 basic auth를 적용하기위해선 simple password file인 .htpasswd 파일을 생성해야 합니다. .htpaaswd 파일을 생성하기위해 먼저 아래의 명령어로 apache bench tool을 다운로드 받습니다. # download apache bench tools yum insta..
이번글에서는 nginx의 Rate Limiting을 사용해 incoming connection을 제한하는 방법에 대해 알아보도록 하겠습니다. 1. Rate Limiting이란? incoming connection에 대한 rate를 제한하는 기능입니다. 예를 들어 너무 많은 connection이 동시에 발생해 server에 부담이 가는 경우, 정의한 rate limit을 초과한 connection은 reject 할 수 있습니다. rate limiting을 사용하면 특정 incoming connection을 제한하거나 manage 할 수 있습니다. rate limiting을 사용하는 이유는 다음과 같습니다. • Security : 동일 ip에 대한 반복적인 incoming connection을 제한해 bru..
이번글에서는 nginx의 HTTPS를 사용해 보안성을 향상시키는 방법에 대해 알아보도록 하겠습니다. 1. HTTPS란? HTTP의 보안성을 강화한 차세대 프로토콜입니다. HTTPS는 소켓 통신에서 일반 텍스트를 이용하는 대신, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화합니다. 따라서 데이터의 적절한 보호를 보장합니다. HTTPS의 기본 TCP/IP 포트는 443입니다. 😎 2. HTTPS 적용하기 이전 글(https://velog.io/@minholee_93/Nginx-HTTP2)에서 우리는 Self Signed SSL을 사용해 HTTPS 통신을 하는 방법에대해 간단히 알아보았습니다. 이번 글에서는 HTTPS에 대해 좀더 자세히 알아보고, Nginx의 HTTPS를 optimize 하는 방법에..
이번글에서는 nginx에서 HTTP/2를 사용해 성능을 향상시키는 방법에 대해 알아보도록 하겠습니다. 1. HTTP/2란? 기존의 HTTP/1.1을 개선한 차세대 HTTP 프로토콜입니다. 2. HTTP/1.1 vs HTTP/2 HTTP/1.1과의 차이점은 아래와 같습니다. 2-1) binary protocol HTTP/2는 binary protocol을 사용해 데이터를 전송함으로써 기존의 HTTP/1.1보다 월등히 compact하게 data를 전송합니다. 또한, 이를 통해 data transfer 중에 일어날 수 있는 error를 최소화할 수 있습니다. 반면에 기존의 HTTP/1.1은 textual protocol입니다. 2-2) compressed header HTTP/2은 comprssed heade..
이번글에서는 nginx의 fastCGI cahce를 사용해 성능을 향상시키는 방법에 대해 알아보도록 하겠습니다. 1. FastCGI Cache란? nginx의 simple server side cache 방법입니다. nginx의 FastCGI Cache 사용해 dynamic language의 response를 저장해 놓으면, server side language process를 최소화시켜 서비스의 성능 향상 및 server의 부하를 감소시킬 수 있습니다. 예를 들어 위와 같이 client가 요청한 작업의 결과물을 php와 같은 server side process가 response할 경우, nginx는 해당 response 값을 client에 전달하기전에 Cache라고 불리는 memory에다 저장해놓을 수..
이번글에서는 static resource의 delivery 성능을 향상시키는 방법에 대해 알아보도록 하겠습니다. 1. Compressed Response란? response data를 압축해서 return 하는 방법입니다. 예를 들어 client가 nginx에 static resource를 request 할때 자신들은 compressed data를 accept 할 수 있다고 indicate 할 수 있습니다. 그렇다면 nginx는 아래와 같이 static response를 압축해서 client 한테 전달합니다. 이후 client browser에서 compressed data를 unzip 해서 rendering 하는 것은 automatic 하게 처리하기 때문에 nginx에서는 해당 부분은 고민할 필요가 없습..
이번글에서는 Nginx에서 response data에 header를 추가하는 방법에 대해 알아보도록 하겠습니다. 1. Expires Header란? nginx는 expires header를 통해 client에게 response data를 얼마나 오랫동안 client의 browser에 cache할 것인지를 알려줍니다. 예를 들어 이미지 파일과 같은 static file들은 자주 변경되지 않기 때문에 nginx는 client의 browser에게 비교적 긴 시간동안 해당 파일들을 본인들의 local browser에 cache해 놓을 것을 요청합니다. 이를 통해 향후 동일한 이미지에 대한 request를 browser의 cache로 대체함으로써 전체 service의 성능 향상을 꾀할 수가 있습니다. 반대로 da..
이번글에서는 Nginx에 dynamic module을 추가하는 방법에 대해 알아보도록 하겠습니다. 1. Dynamic Module이란? nginx의 module에는 defualt module인 static과 추가적으로 사용할 수 있는 dynamic moudle이 있습니다. 이전글 https://velog.io/@minholee_93/Nginx-Overview-Install 에서 설명드렸다 싶이 Nginx를 source code version으로 install 하면 여러가지 dynamic module을 손쉽게 추가해 사용할 수 있습니다. 현재 nginx에 설치된 module은 다음의 명령어로 확인할 수 있습니다. nginx -V 현제 제 nginx에는 static moudle들만 설치되어 있습니다. ins..
이전글에 이어서 Nginx의 configuartion에 대해 알아보도록 하겠습니다. 11. Buffer & Timeout 이번글에서는 buffer와 timeout을 적절히 사용해 ngimx의 performance를 증가시키는 방법에 대해 알아보도록 하겠습니다. 11-1) buffer 먼저 buffer란 nginx와 같은 process가 ram으로 부터 데이터를 읽거나 쓰는 것을 의미합니다. 예를 들어 nginx는 http로 들어온 request를 먼저 buffer에 저장하고 처리합니다. 만약 buffer에 여유가 없을 경우 hard disk와 같은 곳에 저장해놓기도 합니다. 동일하게 reponse 값도 client에게 reutrn하기 전에 먼저 buffer에 저장된 후 nginx는 buffer에서 데이터..