쿠키/세션/토큰
𝙌. 쿠기와 세션에 대해서 설명해 주세요.
쿠키는 HTTP 서버가 클라이언트를 식별할 수 있도록 하기 위해서 사용되는 것입니다.
클라이언트가 웹 서버에 처음 접속하면, 서버는 쿠키를 생성에서 클라이언트에게 줍니다.
이후 클라이언트는 서버에 요청을 보낼 때 자신의 정보가 들어있는 쿠키를 같이 보냅니다.
그러면 서버는 쿠키를 통해 클라이언트를 식별할 수 있습니다.
쿠키는 클라이언트 단에 저장되기 때문에 쿠키에 들어있는 사용자 정보가 유출될 수 있는 단점이 있습니다.
세션은 브라우저가 종료되거나, 서버에서 해당 세션을 삭제할 수 있기 때문에 쿠기보다 보안성이 좋습니다.
서버에서 데이터를 저장하므로 서버의 부하가 커진다는 단점이 될 수 있습니다.
쿠키와 세션을 사용하는 이유는 HTTP의 connectionless(비연결성), stateless(비상태성)라는 특징 때문입니다. 클라이언트가 요청(request)을 했을 때 그 요청에 맞는 응답(response)을 보낸 후 연결을 끊고, 서버는 클라이언트에 대한 상태 정보를 유지하지 않기 때문에 알 수 없게 됩니다.
만약 쿠키와 세션을 사용하지 않는다면 인프런에 로그인을 했음에도 페이지를 이동할 때마다 계속 로그인을 해야 됩니다. 또한 로그인을 할 때, 아이디 비밀번호 저장을 하여 다음번에 재방문할 때에도 해당 아이디와 비밀번호를 자동으로 입력하도록 할 수 있습니다. 이 외에도 쇼핑몰의 장바구니 기능과 팝업에서 “오늘 더 이상 이 창을 보지 않음" 등의 편의성을 제공할 수 있게 됩니다.
𝙌. 세션이 보안도 좋은데 쿠키를 사용하는 이유는 뭔가요?
세션은 서버의 자원을 사용하기 때문에 서버가 느려질 수 있고 서버 자원이 부족할 수 있습니다.
따라서 쿠키를 사용하면 서버 자원의 낭비를 방지하여 웹사이트 속도를 높일 수 있습니다.
𝙌. JWT 토큰에 대해서 설명해 주세요.
토큰은 클라이언트 인가하는 방법입니다.
토큰에는 서버가 비밀키로 만들어둔 서명이 있는데,
서버는 공개키로 서명을 검증해서 클라이언트를 인가할 수 있습니다.
세션과 달리 토큰은 그 자체를 공개키로 검증만 하면 되기 때문에
서버에 부하를 주지 않고, 여러 서버에 사용할 수 있는 확장성이 있습니다.
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
그리고 JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다
JWT는 Header, Payload, Signature 세 가지 문자열의 조합으로 구성된다.
Header는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있으며,
Payload는 서버에서 첨부한 사용자에 관한 정보와 데이터가 담겨있다.
Signature에는 전자서명이 담겨있다.
REST
𝙌. REST에 대해서 설명해 주세요. Restful API는 뭘까요?
REST는 자원을 이름으로 구분하고, 해당 자원의 상태를 주고받는 방법을 의미합니다.
구체적으로는 HTTP URL을 통해 자원을 명시하고,
HTTP Method를 통해 해당 자원에 대해 CRUD 연산을 적용하는 것입니다.
REST의 원리를 따르는 시스템을 RESTful이라고 부르고, REST 형식의 API를 REST API라고 부릅니다.
𝙌. URL, URI, URN 차이가 뭘까요?
URI는 URL과 URN을 포함하고 있다.
URI는 인터넷에 있는 자원을 어디에 있는지 자원 자체를 식별하는 방법이다
URL은 자원이 어디 있는지 위치를 알려주기 위한 규약이다.
URN은 자원에 이름을 부여하는 것이다.
http://www.naver.com/index.html?page=1232950&id=776
http://www.naver.com/ 서버에 위치한 index.html 페이지는 query string인 page의 값에 따라 여러 가지 화면 결과를 나타나게 된다.
이때 여기서 URL은 index.html의 위치를 표기한 http://www.naver.com/index.html까지이다.
하지만 사용자가 원하는 정보에 도달하기 위해서는? page=1232950&id=776라는 식별자(Identifier)가 필요한 것이다.
따라서 엄격히 구분하자면 위의 http://www.naver.com/index.html?page=1232950&id=776 주소는 URI이고,
식별자가 빠진 http://www.naver.com/index.html를 URL이라고 하는 것이다.
출처:https://inpa.tistory.com/entry/WEB-🌐-URL-URI-차이
[Inpa Dev 👨💻:티스토리]
CORS
𝙌. SOP과 CORS에 대해 설명해 주세요.
CORS는 클라이언트 브라우저에서 현재 접속한 사이트 외에 다른 도메인에 접근할 수 있도록 처리해주는 웹 브라우저 표준 기술입니다.
브라우저에는 크로사이트 스크립트 등의 이유로 보안상 스크립트를 사용해서 다른 도메인으로 접근하는 것을 제한합니다.
이를 Same Origin Plicy라고 하는데, 이러한 정책 제한을 넘어서기 위해 CORS가 필요합니다.
예를 웹 서비스를 프론트와 백으로 완전히 나누고 API로 묶는 방식으로 구현한 경우
백엔드 서버에 프론트엔드에 대한 CORS 설정을 허용해줘서 프론트엔드가 백엔드 API를 사용할 수 있게 해줘야 합니다.
웹 보안
𝙌. XSS 공격이 무엇이고, 방어하는 방법을 설명해 주세요.
XSS는 웹 브라우저에 악성 스크립트를 삽입하여 사용자 정보를 탈취하는 공격방식입니다.
웹 브라우저에서 사용자 입력값과 출력값을 철저히 검증해서 XSS를 예방할 수 있습니다.
모든 입력값에 대해 악의적인 스크립트가 있는지 체크하는 validation을 추가하고,
입력값을 출력할 때는 특수문자를 이스케이스 하는 처리를 추가해서 예방하는 방법이 있습니다.
𝙌. CSRF 공격이 무엇이고, 방어하는 방법을 설명해 주세요.
CSRF 공격은 사용자가 의도하지 않는 악의적인 요청을 보내도록 하는 공격입니다.
이를 방지하기 위해 서버는 CSRF 토큰을 클라이언트에 전달하는 방법으로 해결할 수 있습니다.
𝙌. SQL Injection 공격이 무엇이고, 방어하는 방법을 설명해 주세요.
악의적인 SQL 쿼리문을 삽입하여 데이터베이스를 비정상적으로 조작하는 공격 기법입니다.
웹 브라우저에서 들어오는 입력값에 대해 악성 SQL 패턴에 대한 validation을 추가하고,
데이터베이스에 평소 사용자에 의해 발생하는 SQL 패턴이 아닌 비정상적인 SQL이 발생하는지
주기적으로 모니터링하고 비상 알람을 걸어 두는 방식을 선택할 수 있습니다.
웹 캐시
𝙌. 웹 캐시에 대해 설명해 주세요.
웹 캐시는 자주 사용되는 자원의 사본을 자동으로 보관하는 장치입니다.
만약에 어떤 HTTP 요청에 대한 사본이 캐싱되어 있으면,
서버까지 요청이 가지 않고 바로 캐시에서 바로 자원을 제공받게 됩니다.
캐시를 사용하면
반복되는 요청을 줄여줘서 서버의 부하를 줄여주고
갑작스러운 트래픽을 대처하게 해 주고,
네트워크 병목을 줄여주고,
먼 거리로 인한 전송 지연을 줄여줍니다.
프록시 (Proxy)
𝙌. 프록시 서버에 대해서 설명해 주세요.
프록시 서버는 클라이언트와 서버 사이에 존재하는 중개자입니다.
그렇기 때문에 프록시는 클라이언트로 동작하기도 하고 서버로 동작하기도 합니다.
프록시를 사용하는 이유는 접근 제어를 해서 보안이 강화되고, 같은 요청에 대해서는 캐시 하도록 할 수 있다.
또한 모든 요청이 나가는 입구이기 때문에 사용률 파악에도 도움이 된다.
𝙌. 포워드 프록시에 대해서 설명해 주세요.
포워드 프록시는 클라이언트 앞에 위치하는 프록시입니다.
포워드 프록시를 사용해서 익명으로 서버에 접근할 수 있습니다.
𝙌. 리버스 프록시에 대해서 설명해 주세요.
리버스 프록시는 서버 앞에 위치하는 프록시입니다.
실제 서버 앞에 리버스 프록시를 둠으로써 보안을 강화(ex. https)할 수 있습니다.
그리고 리버스 프록시 뒤에 여러 대의 서버를 둬서 부하를 분산시킬 수 있습니다.
LB
𝙌. L7 로드 밸런서에 대해서 설명해 주세요.
OSI 모델의 7번째 계층인 애플리케이션 계층에서 동작하는 로드 밸런서입니다.
로드 밸런서는 클라이언트로부터 받은 요청을 여러 서버로 분산시키고,
서버로부터 응답을 클라이언트에게 전달하는 역할을 합니다.
커넥션 타임아웃/리드 타임아웃
𝙌. 커넥션 타임아웃과 리드 타임아웃에 대해 설명해 주세요.
커넥션 타임아웃은 TCP 연결 확립이 수행되는데 걸리는 최대 시간입니다.
리드 타임아웃은 요청과 응답이 수행되는데 걸리는 최대 시간입니다
출처