웹 캐시 웹 캐시(영어: 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의..
오늘은 영속성 컨텍스트의 스코프와 준영속 상태에 대해서 공부하다 생긴 의문점에 대한 것과 이를 해결해 나갔던 과정에 대해서 작성한다. 김영한님의 JPA강의를 듣고 자바 ORM 표준 JPA 프로그래밍을 다시 정독하던 중 한 코드에서 의문이 생겼다. public class ExamMergeMain { static EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); public static void main(String[] args) { Member member = createMember("memberA", "회원1"); member.setName("updateName"); mergeMember(member); } stat..
오늘은 HTTP 요청 파라미터 조회와 HTTP 메시지 바디를 직접 조회하는 방법에 대해서 알아본다. @RequestParam @RequestParam는 HTTP 요청 파라미터를 바인딩 하기 위해 사용된다. @RequestParam(name = xxx)과 같이 파라미터 이름을 지정하면 해당 파라미터와 데이터가 바인딩된다. 파라미터의 이름과 바인딩할 인자의 이름이 동일한 경우 name을 생략할 수 있다. 또한 이름이 동일하고 타입이 String, int, Integer와 같은 단순한 타입이라면 @RequestParam까지 생략 가능하다. ... @GetMapping("/posts") public ResponseEntity requestParam(@RequestParam("postId") Long postId..
참고: https://www.acmicpc.net/problem/20167, https://www.acmicpc.net/problem/20181 꿈틀꿈틀 호석 애벌레 - 기능성 문제에 주어진 조건이 크지 않으므로 브루트 포스로 해결할 수 있다. 애벌레가 먹이를 먹는 경우와 그렇지 않은 경우로 나눌 수 있고, 만족도가 K 이상일 때 만족도를 0 으로 하고 탈피 에너지를 증가하면 해결할 수 있다. 꿈틀꿈틀 호석 애벌레 - 효율성 동일한 문제로 제한 조건만 달라졌다. 먹이의 개수가 100,000개이며 만족도가 10^8 까지 가능하다. 따라서 브루트 포스로 해결할 수 없다. 일단 특정 구간에서의 누적된 만족도를 구해야하므로 투 포인터(left, right)를 사용하여 누적합을 구할 수 있을 것 같다. 그리고 해..
JPA의 Entity를 수정할 때 발생한 실수에 대해서 기록한다 문제상황 JPA를 사용하면 트랜잭션 범위 안에서 Entity의 데이터를 변경할 때, 데이터를 변경하는 작업 이외에 다른 메소드는 호출하지 않는다. 이는 Entity가 영속성 컨텍스트에서 제공하는 변경 감지 덕분이다. 하지만 JPA에 대한 이해가 부족하면 다음과 같은 실수가 발생할 수 있다. Person 클래스의 name, address는 nullable=false로 설정 되어있다. 그리고 Person의 name을 null로 변경 했을때 나는 예외가 발생하는 것을 기대했다. 하지만 결과는 다음과 같았다. Person의 이름은 null로 변경되었고, 예외는 발생하지 않았다. 문제분석 @Column에 대해서 Person 클래스의 name 필드에 ..