웹 캐시 웹 캐시(영어: web cache) 또는 HTTP 캐시(HTTP cache)는 서버 지연을 줄이기 위해 웹 페이지, 이미지, 기타 유형의 웹 멀티미디어 등의 웹 문서들을 임시 저장하기 위한 정보기술이다. 웹 캐시 시스템은 이를 통과하는 문서들의 사본을 저장하며 이후 요청들은 특정 조건을 충족하는 경우 캐시화가 가능하다. 웹 캐시 시스템은 일종의 어플라이언스나 컴퓨터 프로그램을 의미할 수 있다. 동일한 서버에 다시 접근할 때에는 근처에 있는 프록시 서버의 웹 캐시에 저장된 정보를 불러오므로 더 빠른 열람이 가능하다.[위키백과] 웹 캐시의 장점 웹 캐시를 사용하면 클라이언트가 원(Origin) 서버에 정적 콘텐츠를 요청하지 않는 덕분에 얻을 수 있는 몇 가지 장점이 존재한다 불필요한 데이터 전송 감..
Apache와 Nginx Apache HTTP Server와 Nginx는 현재 전 세계에서 가장 많이 사용되는 웹 서버이다. 두 웹 서버는 정적 콘텐츠를 제공할 뿐 아니라 리버스 프록시 등 다양한 기능을 제공한다. 사실 Nginx는 Apahce의 단점을 개선하기 위한 보조 수단을 목적으로 탄생했었다. 따라서 Apache HTTP Server의 등장과 그 한계점 그리고 Nginx의 탄생 과정을 살펴보면 두 웹 서버의 차이를 이해할 수 있을 것이다. Apache HTTP Server의 등장 Apache HTTP Server의 등장 이전에는 NCSA HTTPd라는 웹 서버가 존재했다. NCSA HTTPd는 세계에서 2번째로 개발된 웹서버로 CGI(Common Gateway Interface)를 처음으로 도입하..
오늘은 토큰 기반 인증 시스템에서 가장 대중적으로 사용하는 JSON Web Token(JWT)에 대해서 알아본다 JWT란? JSON Web Token(JWT)는 JSON Obejct 형태로 클라이언트-서버간 정보를 안전하게 전송하기 위한 표준이다. 간단하고 독립적인 방법을 제공하며 HMAC 같은 암호화 알고리즘이나 private/public key를 통해 서명(sign)된다. 주로 로그인 기능에서 사용된다. 사용자가 로그인에 성공하게 되면 서버에서는 JWT를 발급한다. 클라이언트에서는 발급 받은 토큰을 쿠키, 로컬 스토리지 같은 저장소에 보관한다. 그리고 서버에 요청할 때마다 토큰을 함께 전송하는데 쿠키나 HTTP URI 혹은 헤더를 사용하는데 일반적으로는 아래처럼 Authorization 헤더에 토큰을..
HTTP 통신의 가장 큰 특징 중 하나는 무상태성(Stateless)이다. 즉, 서버에서 클라이언트의 정보를 저장하지 않는다는 것이다. 이러한 무상태성은 클라이언트를 식별하기 까다롭다. 예를 들어 로그인한 사용자만 게시물을 작성할 수 있는 커뮤니티에 게시물 등록 요청이 서버에 도착했을 때, 이 사용자가 로그인한 사용자인지 로그인 하지 않은 사용자인지 구별할 수 없다. HTTP는 클라이언트의 상태를 저장하지 않기 때문이다. 이러한 한계를 해결하기 위해 두 가지 인증 시스템이 사용된다. 세션 기반 인증 시스템과 토큰 기반 인증 시스템이 그것이다. 오늘은 두 가지 인증 방식에 대해서 알아본다. 세션기반 인증 세션기반 인증 시스템에서는 사용자가 로그인한 후 사용자의 정보를 서버에서 관리해야 한다. 이때 쿠키에 ..
오늘은 CORS에 대한 개념과 Spring MVC와 Spring Security에서 CORS 설정하는 방법에 대해서 알아본다. CORS란 무엇인가? CORS(Cross-Origin Resource Sharing)은 브라우저가 SOP(Same Origin Policy)를 우회하여 다른 출처(Origin)의 자원을 요청할 수 있도록하는 방법이다. SOP는 Chorome, Edge와 같은 브라우저가 클라이언트의 교차 출처(Cross Origin) 요청을 막고, 동일 출처(Same Origin)에 대한 요청만 허가하는 정책을 말한다. 출처란 리소스의 위치를 의미하며 Scheme, Host, Port로 구성된다. 만약 Scheme, Host, Port 중 어느 하나라도 다르면 교차 출처로 인지하게된다. CORS의..
오늘은 HTTP 요청 파라미터 조회와 HTTP 메시지 바디를 직접 조회하는 방법에 대해서 알아본다. @RequestParam @RequestParam는 HTTP 요청 파라미터를 바인딩 하기 위해 사용된다. @RequestParam(name = xxx)과 같이 파라미터 이름을 지정하면 해당 파라미터와 데이터가 바인딩된다. 파라미터의 이름과 바인딩할 인자의 이름이 동일한 경우 name을 생략할 수 있다. 또한 이름이 동일하고 타입이 String, int, Integer와 같은 단순한 타입이라면 @RequestParam까지 생략 가능하다. ... @GetMapping("/posts") public ResponseEntity requestParam(@RequestParam("postId") Long postId..
Java에서 MySQL에 저장된 datetime 형식의 데이터를 가져올 때 시간차가 발생할 수 있다. 오늘은 이 시간 차이를 해소할 수 있는 방법에 대해서 알아본다. 문제 상황 토이 프로젝트 진행 중 MySQL에 저장된 created_at과 자바의 createdAt의 값이 일치하지 않는 경우가 발생했다. 주문 후 DB에 저장된 값과 JSON으로 전달되어 웹에 렌더링한 값을 비교해본다. DB에는 created_at이 2021-09-24T15:47:43 으로 저장된 반면 웹 페이지에는 createdAt이 2021-09-25T00:47:43로 출력된다. 웹 페이지에 렌더링된 값 보다 DB에 저장된 값이 정확히 9시간이 빠르다. 문제 분석 웹 페이지에 렌더링된 값이 DB 보다 9시간이나 늦은 이유는 타임존이 달..
오늘은 Spring MVC의 구조에 대해 알아본다. MVC 패턴 MVC 패턴은 웹 애플리케이션의 구조를 Model-View-Controller로 역할을 나눈 디자인 패턴을 의미한다. 먼저 MVC 패턴의 등장 배경에 대해서 알아본다. MVC 등장 배경 상품 관리 서비스를 개발한다고 가정하자. 상품 관리 서비스에는 상품 등록, 수정, 삭제가 있다. MVC 패턴을 적용하지 않았을 때 MVC 패턴을 적용하지 않고 서블릿만을 사용하여 상품 등록 뷰를 클라이언트에게 전달하기 위해서는 Response Body에 직접 HTML를 작성하여 응답해야할 것이다. 그리고 아래와 같이 등록할 상품 정보를 전달받아 DB에 저장하는 역할의 서블릿도 저장 결과를 클라이언트에게 전달하기 위해 서블릿에서 직접 HTML을 작성해야한다. ..
트랜잭션 서비스 추상화 트랜잭션 웹 커뮤니티에서는 조건에 맞는 모든 사용자의 등급을 업그레이드 시키는 것과 같은 작업이 있다. 만약 사용자의 등급을 업그레이드 시키는 과정에서 예외가 발생하여, 업그레이드가 완료되지 않은 사용자가 존재한다면 불만을 표출할 수 있을 것이다. 따라서 커뮤니티 사용자들의 등급을 업그레이드 시키는 것은 논리적인 하나의 작업단위로 보고, 전체가 다 성공하던지 하나라도 실패하면 모두 실패하던지 해야한다. 즉 사용자들의 등급 업그레이드는 나눌 수 없는 원자적인 작업이라는 것이다. 이러한 더이상 나눌 수 없는 논리적인 작업 단위를 트랜잭션이라한다. 트랜잭션의 경계 DB는 그 자체로 완벽한 트랜잭션을 지원한다. SQL을 통해 다수 레코드의 수정 및 삭제를 위한 요청을 했을 때, 일부만 수..