1. [SERVER] CORS(Cross-Origin-Resource-Sharing)에 대해 설명해주세요.
CORS(교차 출처 리소스 공유)란 추가 HTTP 헤더를 이용해 다른 출처의 자원에 접근 가능한 권한을 부여하도록 브러우저에 알려주는 체제이다.
출처(Origin)란 자원의 위치이다.
서버 자원의 위치를 나타내는 하나의 문자열, URL은 여러 개의 구성요소로 이루어져있다. 이때 출처는 프로토콜과 호스트 그리고 포트 넘버(포트 번호는 생략 가능)까지 모두 합친 것으로 즉 서버의 위치를 찾아가기 위해 필요한 가장 기본적인 것들을 합쳐놓은 것이다.
단순 요청(Simple Request) 1) 서버에 요청을 보낸다. 2) 서버는 Access-Control-Allow-Origin 헤더를 포함하여 브라우저에 응답한다. 3) 브라우저는 Access-Control-Allow-Origin 헤더를 확인하여 CORS 동작 수행을 판단한다.
단순 요청의 조건
요청 메서드가 GET, HEAD, POST 중 하나여야한다.
Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안된다.
Content-Type 헤더는 application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나를 사용한다.
예비 요청(Preflight Request)과 본 요청 서버에 실제 리소스 요청 전 예비 요청을 보내 안전한지 판단한 후 요청을 보내는 방법이다.
1) 실제 요청을 전송할지 판단하기 위해 OPTIONS라는 HTTP 메서드로 서버에 예비 요청을 보낸다. 2) 서버는 이 예비요청에 대한 응답으로 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보낸다. 3) 브라우저는 단순 요청과 동일하게 Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행한다.
CORS 에러 해결 방법
HTTP 응답 헤더를 지정한다.
Access-Control-Allow-Origin: <origin> | *
Access-Control-Allow-Methods: <method>, ...
Access-Control-Expose-Headers: <header-name>, ...
Access-Control-Allow-Headers: <header-name>, ...
Access-Contrl-Max-Age: <delta-seconds>
Access-Contrl-Allow-Credentials: true
HTTP 요청 헤더를 지정한다.
Origin: <origin>
Access-Control-Request-Method: <method>
Access-Control-Request-Headers: <field-name>, ...
JSONP(JSON with Padding) 포맷을 이용한다. 스크립트 요소가 외부 출처 리소스를 가져울 수 있는 특징을 사용하는 방법이다.
프론트엔드와 백엔드 서버 사이 프록시 서버를 둔다.
* SOP(Same-Origin Policy)
같은 출처에서만 리소스를 공유할 수 있다는 규칙이다. 브라우저를 거치지 않고 서버간 통신을 할 때 이 정책이 적용되지 않는다.
다른 출처의 리소스를 요청하면 이는 SOP 정책을 위반하는 것이고 다른 출처의 리소스를 사용할 수 없게 된다. 이때 CORS 오류가 발생한다. 이러한 정책을 통해 XSS나 XSRF 등의 보안 취약점을 노린 공격을 방어할 수 있다.
2. [NETWORK] HTTP 메서드와 각각이 사용되는 경우에 대해서 설명해주세요.
GET 요청받은 URI의 자원을 조회하여 응답한다.
HEAD GET과 동일하지만 응답에 바디가 없고 응답코드와 헤드만 반환한다. 웹 서버 정보 확인, 버전 확인 등의 용도로 사용된다.
POST 요청된 자원을 생성한다. 요청에 URL이 포함되지 않으며 새로 리소스 작성 후 응답 헤더 항목에 URI 주소를 포함하여 응답한다.
PUT 요청한 자원을 수정한다. POST와 다르게 URI를 그대로 사용하며 클라이언트가 요청에 수정할 자원의 URL을 지정한다.
PATCH PUT과 유사하지만 PUT은 전체 자원을 갱신하는 반면 PATCH는 해당 자원의 일부를 교체하는 의미로 사용한다.
DELETE 요청된 자원을 삭제한다(안전상의 문제로 대부분 서버에서 비활성).
TRACE 원격지 서버에 루프백 메시지 호출하기 위해 테스트용으로 사용한다.
OPTIONS 웹서버에서 지원되는 메서드의 종류를 확인할 경우 사용한다. CORS 예비 요청에서 사용된다.
CONNECT 요청한 리소스에 대해 양방향 연결을 시작한다.
3. [PROGRAMMING] SQL Injection에 대해 설명해주세요
악의적인 사용자가 서버에 특정 SQL을 입력하여 데이터베이스에 접근하는 공격이다.
논리적 에러를 이용한 SQL 인젝션(Error based SQL Injection) 입력값 처리 등 보안이 완벽하지 않을 때 의도적으로 쿼리가 무조건 실행되도록 작성한다.
-- 올바른 SQL
SELECT * FROM member WHERE id='juran' AND password='xxx';
-- 잘못된 SQL
SELECT * FROM member WHERE id='juran' AND password=' or '1'=1
UNION 명령어를 이용한 SQL 인젝션(UNION based SQL Injection) 여러 개의 SQL문을 합쳐 하나의 SQL문으로 만들어주는 방법이다.
블라인드 SQL 인젝션(Boolean based SQL Injection) 평범한 SQL 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술이다. 웹에서 SQL 인젝션에 취약하나 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. 평험한 SQL 삽입은 쿼리를 삽입하여 원하는 데이터를 한번에 얻어낼 수 있다는 것과 달리 블라인드 SQL 인젝션은 쿼리가 참과 거짓에 대한 반응만을 구분할 수 있을때 사용되는 기술이다. 쿼리의 결과를 얻어 한글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참고 거짓을 비교하는 과정을 거치며 계속 질의를 보내 일치하는 아스키코드를 찾아낸다. 이런 과정을 반복해 얻은 결과들을 조합하여 원하는 정보를 얻어낸다. 공격자들(크래커들)은 자동화된 툴을 사용하여 공격한다.
블라인드 SQL 인젝션(Time based SQL Injection) 어떤 경우에는 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우가 있을 수 있다. 이런 경우 시간을 지연시키는 쿼리를 주입하여 응답 시간의 차이로 참과 거짓 여부를 판별한다.
저장된 프로시저에서의 SQL 인젝션(Stored Procedure SQL Injection) 저장 프로시저는 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것이다. 공격자가 시스템 권한을 획득해야하므로 공격 난이도가 높으나 공격에 성공한다면 서버에 직접적인 피해를 입힐 수 있다.
다량의 SQL 인젝션(Mass SQL Injection) 기존 SQL 인젝션과 달리 한번의 공격으로 다량의 데이터베이스가 조작되어 큰 피해를 입는 것이다.
공격 대응 방법
사용자 입력에 대한 검증 강화
Prepared Statement 구문을 사용해 사용자 입력값이 바로 데이터베이스 파라미터로 들어가지 않고 DBMS가 미리 컴파일하여 실행하지 않고 대기한다. 그 후 사용자 입력값이 공격쿼리로 들어가게 된다하더라도 이미 의미없는 단순 문자열이기 때문에 공격자의 의도대로 실행되지 않는다.
데이터베이스 노출 방지를 위해 에러 발생 시 사용자에게 보여줄 내용을 제한한다.
웹 방화벽을 사용한다(서버 내 소프트웨어형, 하드웨어 장비로 구성하는 하드웨어형, 프록시형)
2022/02/04
1. [JAVA] 메소드 오버라이딩과 오버로딩에 대해 설명해주세요
오버라이딩과 오버로딩 모두 객체지향 프로그래밍의 다형성을 실현한다.
* 다형성이란 여러 객체에 같은 명령을 내렸을 때 서로 다르게 동작하는 것을 의미한다.
오버라이딩 부모클래스의 메서드와 같은 이름, 같은 매개변수를 재정의하는 것이다.
오버로딩 같은 이름의 메서드를 여러 개 정의하고 매개변수의 수와 타입을 다르게하여 그에 따라 호출할 수 있도록 하는 것이다.
2. [SERVER] CPU랑 메모리 공간이 부족할 때 어떻게 해결할 수 있을까요?
3. [DATABASE] 데이터베이스 트랜잭션(Transaction)에 대해 설명해주세요.
트랜잭션이란 쪼갤 수 없는 업무 처리의 최소 단위를 말한다. 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위로 질의어(SQL)를 이용해 데이터베이스에 접근하는 것을 의미한다.
A(Atomity, 원자성) 트랜잭션 수행 도중 문제가 발생하면 해당 작업이 모두 취소되어야한다.
C(Consistency, 일관성) 트랜잭션 전 후 데이터베이스는 일관된 상태를 유지해야 한다.
I(Isolation, 고립성) 트랜잭션 수행 중 다른 트랜잭션이 끼어들어선 안된다.
D(Durability, 지속성) 트랜잭션 수행 후 변경된 데이터는 영구히 보존되어야한다.
2022/02/05
1. [ALGORITHM] 동적 프로그래밍(Dynamic Programming, DP)에 대해 설명해주세요
복잡한 문제를 간단한 여러개의 문제로 나누어 해결하는 방법이다. 이 방법은 부분 문제 반복과 최적 부분 구조를 갖고 있는 알고리즘을 일반적인 방법에 비해 더 짧은 시간에 풀어내기위해 사용한다.
부분 문제 반복 어떠한 문제가 여러 개의 부문 문제로 쪼개진다.
최적 부분 구조 작은 부분 문제에서 구한 최적의 답을 합쳐 큰 문제의 답을 구할 수 있다.
메모이제이션(Memoization)
동일한 계산을 반복할 때 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램의 실행 속도를 빠르게 하는 기술이다. 즉 공간적 비용을 투자해 시간적 비용을 줄인다.
동적 프로그래밍을 이용한 문제 해결 방식에는 Top-Down/Bottom-Up 두 가지가 있다.
Top Down 문제를 작은 문제로 나누고 각 작은 문제에 대한 해답을 구한 뒤 그 답들을 이용해 전체 문제의 답을 구한다(재귀호출). 코드의 가독성은 증가하지만 작성이 어렵다.
Bottom Up 가장 작은 문제부터 풀어가며 점차 큰 문제를 푸는 방법이다.
2. [NETWORK] 알고 있는 Http Response들에 대해 얘기해주세요
HTTP 응답은 요청과 마찬가지로 3 부분으로 나뉜다.
Status Line(요청의 경우 Start Line) 응답의 상태를 간략하게 나타내준다.
Header 응답(요청)에 대한 추가 정보를 담고 있다.
Body 응답(요청)의 실제 내용으로 없는 경우도 있다.
대표적인 HTTP 응답 코드
2XX 요청 처리 성공 200 요청이 성공적으로 처리됨 201 요청이 성공적으로 처리되어 새로운 리소스가 생성됨
3XX 리다이렉션, 요청을 완료하기 위한 추가 작업 조치 필요 300 요청에 대해 서버에서 여러 개의 응답이 있음 301 요청한 리소스가 영구적으로 이동함(URI이 변경됨) 302 요청한 리소스가 일시적으로 이동함(URI이 일시적으로 변경됨, 향후 동일한 URI 사용)
4XX 클라이언트 오류 400 잘못된 요청으로 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음 401 비인증, 이 응답 코드 사용 시 반드시 브라우저에 어느 인증 방식을 사용할것인지 보내야함 403 클라이언트의 접근 권한이 없음(401과 다르게 인증을 통과하더라도 권한이 없을 경우 접근할 수 없음) 404 요청받은 리소스를 찾을 수 없음
5XX 서버 오류 500 내부 서버 오류 502 게이트웨이 서버 오류
3. [DATABASE] 데이터베이스 튜닝의 3가지 단계에 대해 설명해주세요.
데이터베이스 튜닝이란 데이터베이스의 성능 향상을 위해 OS나 데이터베이스 자체의 구조를 이해하고 필요한 요소를 변경하는 작업이다.
[1단계] DB 설계 튜닝(모델링 관점) 데이터베이스 설계 단계에서 성능을 고려하여 설계한다. 파티션을 이용한 테이블 분할 및 통합, 효율적인 인덱스 설정, 정규화/반정규화, 분산파일 배치, 그 외 슈퍼/서브타입 등의 데이터 모델링
[2단계] DBMS 튜닝(환경 관점) CPU와 메모리 I/O 관점에서 성능을 고려하여 메모리나 블록 크기를 지정한다. 실제 필요한 데이터만 조회하는 I/O 최소화, Buffer Pool 튜닝, 커밋과 체크 포인트 주기 조정, 스레드, 미들웨어 연동 등
[3단계] SQL 튜닝(APP 관점) SQL 작성시 성능을 고려하여 작성한다. 옵티마이저 설정, 힌트 사용, 인덱스 활용, 조인 방식이나 순서 조정, 동적 SQL 지양, 다중 처리, 병렬 처리 등
댓글 영역