분류 전체보기
-
Spring Security에서 CORS 해결spring/security 2021. 3. 24. 15:30
배경 한 서버에서 데이터와 정적파일을 같이 렌더링해 사용자의 요청을 처리하는 방식이 아닌 프런트서버와 api서버를 분리하여 프로젝트를 진행했다. 테스트 방식은 먼저 postman을 이용해 올바른 응답을 받는지 테스트하고 그 다음 프런트서버를 띄우고 브라우저를 통해 api서버와 통신하는 테스트를 진행했다. 그런데 api서버의 코드는 전혀 바뀐 바가 없었는데 postman을 이용해 테스트할 때는 정상적인 응답을 하던 서버가 프런트서버를 띄운 뒤 브라우저를 통해 테스트할 때는 오류가 났던 것이다. 파헤쳐보자. 테스트 과정 코드를 보면 알겠지만 localhost:8080/hello로 get요청을 보내면 hello란 스트링을 body에 담아 전달하는 아주 흔한 통신이다. 결과는 당연히 성공이다. 이제 react의..
-
travisCI를 이용해 REACT 빌드 및 S3에 배포하기infrastructure 2021. 3. 24. 13:51
배경 이전에 API서버인 스프링프로젝트는 EC2에 배포한 바 있었다. 이번엔 정적 페이지만을 구성하는 프론트 웹페이지를 S3에 배포해보자. 그런데 EC2와 같은 서버에 배포해야 맞는 것 같은 프론트 서버를 단지 파일서버인 S3에 배포해 접근하는 게 가능할까? 딥하게 가면 아직 이해하지 못하니 간단하게 이미 만들어진 html파일만 S3에 올리고 서비스하는 방식으로 이해하자. S3버켓 만들기 원하는 이름과 리전을 선택하고 누구나 접근할 수 있도록 해야하기 때문에 퍼블릭 액세스 차단을 모두 풀어 놓고 나머지는 놔둔 상태로 버켓을 생성하자. 버켓에 들어간 뒤 속성에서 정적 웹 사이트 호스팅을 편집하자 활성화를 누르면 인덱스 문서를 설정할 수 있는데 리액트의 기본 인덱스 파일은 index.html이므로 따로 바꾸..
-
데이터베이스 기초(쿼리 위주)database 2021. 3. 16. 13:50
SQL - DML : 데이터를 다루는 가장 기본적이고 자주 사용하는 쿼리 - DDL : 데이터를 정의하는 테이블을 관리하는 쿼리 - DCL : 트랜젝션과 같은 데이터를 제어하는 쿼리 주요특징 - 예약어와 데이터베이스 객체명은 대소문자를 구분하지 않는다 DESC 테이블 정보 확인하기 CHAR VS VARCAHR CHAR(NUM)은 고정길이 문자열로 데이터 저장 시 NUM만큼 반드시 메모리가 할당된다. 반면 VARCHAR(NUM)은 가변길이 문자열로 데이터 저장 시 저장한 만큼만 메모리가 할당되어 저장한다. 괄호 안의 NUM은 최대 길이다. 조건 검색(WHERE) - 열 조건 : SELECT CNAME1, CNAME2 ... - 행 조건 : WHRER ID = ... - 문자열 리터럴은 ''으로 감싸서 표기..
-
HandlerMethodArgumentResolver 동작 원리spring/core 2021. 3. 8. 23:06
배경 프로젝트에서 가장 기본 도메인인 회원의 CRUD를 구현하고 있었다. JPA를 이용해 큰 어려움 없이 CR기능은 구현했고 스무스하게 UD관련 기능을 구현했다. 별 고민없이 클라이언트에서 회원id와 함께 변경에 필요한 데이터를 api서버로 전달했다. api서버에서는 회원id와 나머지 변경을 원하는 데이터를 DTO로 받아 작업을 처리했다. 포스트맨을 이용해 간단히 테스트를 진행했는데 내 로직에 큰 결함이 있는 걸 알았다. id를 클라이언트에서 넘긴 후 그 id로 조회한 회원의 데이터를 수정할 수 있다면 어떤 회원이 악의적으로 다른 회원의 데이터를 수정할 수 있었다. 즉, 서버에서 인증한 회원이라면 다른 회원의 정보를 임의의 id를 통해 접근할 수 있는 것이었다. 이 문제를 해결하기 위해 id에 의존한 회..
-
AOP 동작 원리spring/core 2021. 3. 6. 01:05
배경 토비의 스프링 실습 공부 AOP의 등장 배경을 코드로 익히면서 실제 스프링이 재사용 가능한 범용적인 AOP를 어떻게 적용하는지 코드를 통해 알아보자. 개인적으로 내용이 길고 어려워서 몇 번 씩 반복 중이다. 요구사항의 변화 위와 같이 메세지를 전달받으면 간단하게 Hello를 추가한 메세지를 반환하는 오브젝트가 있다고 해보자. Hello서비스를 이용하는 클라이언트는 메세지를 넣으면 자동으로 Hello를 추가해주는 기능에 만족하고 있었다. 이때 클라이언트는 위 메소드가 실행될 때마다 콘솔에 시작을 알리는 텍스트를 찍고 메소드가 끝나기직전에 끝을 알리는 텍스트를 찍어주는 기능을 추가해 달라고 요청했다. 단순하게 구현이 가능하지만, 만약 클래스의 메소드가 100개였다면 어땠을까? 간단하게 100개의 메소드..
-
암호화된 패킷 교환 방법네트워크/보안 2021. 3. 4. 13:04
배경 두 서버가 데이터를 교환할 때 주로 네트워크를 이용한다. 물리적으로 USB를 이용해 전달하지 않는다면 거의 99% 네트워크를 이용해 데이터를 교환하게 된다 네트워크 인프라는 사유재산이 아니다. 누구나 이용할 수 있고 누구나 접근할 수 있다. 즉, 내가 네트워크를 이용해 데이터를 전송하게 되면 중간에 누군가가 가로챌 수 있다는 의미다. 클라이언트에서 만든 데이터의 성격이 서버에서만 확인해야 하는 보안적인 내용이라면 또한 네트워크를 이용해 데이터를 전송할 계획이라면 전송할 데이터를 암호화해야 한다. 패킷을 가로채는 걸 막을 순 없어도 가로챈 패킷의 암호화된 데이터를 복호화할 수 없게 만드는 것이다. 암호화한 데이터를 원하는 서버만 정확하게 복호화하는 방법으로 대칭키 암호화를 사용한다. 클라이언트와 서버..
-
SecurityContextHolder의 역할 및 원리spring/security 2021. 3. 3. 13:55
배경 WAS를 구성할 때 유저의 인증 인가를 관리하는 프레임워크로 spring security를 선택했다면securityContextHolder를 사용해본 경험이 있을 거다. 지금 내 프로젝트에서도 비지니스로직에서 게시물을저장할 때 SecurityContextHolder를 사용해 게시물의 작성자를 등록하고 있다.(이렇게 비지니스로직에 기술종속적 코드가 나오는 게 안 좋은 것 같긴 하다 => 아규먼트리졸버로 미리 처리) SecurityContextHolder의 역할은 간단하다. 객체의 세션을 CRUD하는 API를 제공하고 사용하면 그만이다. 하지만 본인은 코드 상에서 세션을 따로 저장한 적도 없을 뿐더러 세션을 get할 때 HttpRequest를 파라미터로 제공하는 웹 기술에 종속적인 방식을 사용하지 않는..
-