CS

네트워크 스터디 3주차

쿠키와 세션에 대해서 설명해주세요.

쿠키 : 세션 아이디를 전송하는 데에 사용되는 매체. 브라우저는 요청시 마다 쿠키를 http 헤더에 넣어서 전송할 수 있다. 단 클라이언트 단에서 조작하기 때문네신뢰할 수 없는 데이터이다

세션 : 서버 내에 남어있는 연결 정보. 사용자와 서버 사이의 연결을 확인하기 위한 정보이다. 세션마다 클라리언트를 구별하기 위해 세션 아이디(랜덤생성) 생성 후 클라이언트에 넣어주게 된다
예를 들어 세션 로그인 방식을 채택하게 된다면 사용자가 아이디와 비밀번호를 입력 시 유효한 세션 아이디를 쿠키에 실어주고 로그아웃 시에는 쿠키에 세션 아이디를 삭제한다. 세션에 유효기간에 지나도 더이상 해당 세션을 사용할 수 없게 된다.

 
궁금해서 네이버 로그인 할 때 api 쿠키 찾아봄

 
 
jwt token이란?

json 객체에 인증에 필요한 정보들을 담은 후 암호화된 방식으로 서명한 토큰으로, 인터넷 표준 인증 방식.(RFC7519 표준)

서버와 클라이언트 간 정보를 주고 받을 때 Http 리퀘스트 헤더( Authorization 헤더)에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다. 

jwt는 헤더, 페이로드, 서명이 들어간다. 헤더와 페이로드는 base64 인코딩이 되어있지만 서명은 (공개키/개인키 또는 비밀키)로 암호화된다.

세션아이디를 이용한 쿠키 인증방식과 다르게
1) 제한된 접근(view만 허용등)을 허용할 수 있으며
2) 인증 당사자가 클라이언트와 서버 둘사이가 아닌 신뢰하지 않는 당사자 여럿 포함된다.

세션을 가지지 않아도 되기 때문에 마이크로서비스의 인증/인가 시 주로 사용된다.
 
 
참고 영상)

https://dongsik93.github.io/til/2019/12/12/til-jwt2-2/

 

JWT에 대한 이해 2-2 with JWT handbook - 동식이 블로그

JWT에 대한 이해 2-2

dongsik93.github.io

 

JWT (JSON Web Token) 이해하기와 활용 방안 - Opennaru, Inc.

JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다.

www.opennaru.com

 
SOP과 CORS

same-origin-policy document마다 출처가 어딘지 꼬리표를 달아놓는데 이것이 origin

같은 origin이면 상호간의 document에 접근 가능하지만 cross-origin (다르다면) 상호간의 document 일반적으로 접근 불가하다 (window postMessage 같은 것들로는 접근 가능하다.)

같은 origin이라고 판별하는 기준은 

scheme + host+port(명시된 경우)이다.

https://jyu-log.tistory.com/

(scheme :https, host : jyu-log.tistory.com, port : (명시x))

따라서 이것이 다르면 기본적으로 cross-origin으로 보게 되고 다른 오리진의 외부 리소스들과의 상호작용이 어려워진다.

예를 들어 iframe을 사용하는 경우 상위 페이지의 하위 iframe을 참조할 수 없다거나, 다른 사이트의 로컬 스토리지 등에 접근하지 못하는 것 등이다.

그러나 주의할 것이 cross origin 에도 다른 서버에 자원을 요청하는 행위(write)는 허용이 된다. (preflight는 예외 - access-control-allow-origin을 반환하는지 봄)

따라서 외부 이미지라고 하더라도 img 태그의 소스에서 가져오거나 유튜브 링크나 외부 링크들을 요청하고 (서버는 정상적으로 응답함) 임베딩하는 것은 가능하다.

cross-origin 자원을 read할 때 즉 브라우저가 보안 상의 문제로 읽기를 거부하는 것이다. 

그러나 cross-origin이라고 하더라도 자원을 공유하고 싶은 경우가 분명히 있다. 이런 경우


CORS(cross-origin-resource-sharing)를 사용할 수 있다.

브라우저가 origin 헤더에 출처를 추가하여 요청하고 해당 헤더 기반으로 서버는

Access-Control-Allow-Origin를 추가하여 응답하여 브라우저는 해당 값을 보고 비교하여 권한이 있는 지를 확인한다.


https://www.youtube.com/watch?v=6QV_JpabO7g

 

 

CORS가 캐시를 만났을 때 – 화해 블로그 | 기술 블로그

CORS가 캐시를 만났을 때 개발자라면 한번쯤 CORS 정책 위반 에러를 경험합니다. 대부분 CORS 헤더를 추가하는 것으로 해결할 수 있지만 캐시를 사용할 경우 예상치 못한 상황을 경험할 수도 있습니

blog-wp.hwahae.co.kr

CSRF 공격이 무엇이고, 방어하는 방법을 설명해주세요.
cross-site request forgery

사용자의 브라우저를 속여서 다른 사이트에 요청을 전송하여 받은 악의적인 소스를 가지고 있는 채로 이미 로그인한 사이트에 대한 요청을 전송한다. 사용자의 브라우저 신용을 이용하는 것이다. 이때 비밀번호를 바꾼다거나 민감한 정보를 빼오거나 혹은 아예 바꿔버릴 수 있다. jwt의 수명을 짧게 유지하는 것도 도움이 되고 요청 헤더에  레퍼러 정보를 확인해 요청자의 host와 referrer 정보가 일치하는지 등을 체크하는 방법 등이 있다. 민감한 정보의 변경을 요청하는 경우 추가 인증방식 (캡챠 등)의 과정을 넣는 것도 좋은 방법이다.


XSS 공격이 무엇이고, 방어하는 방법을 설명해주세요.

cross-site scripting

신뢰할 수 있는 사이트에 자바스크립트를 주입하는 공격이다.

쿠키와 저장소의 토큰을 훔쳐, 엑세스 토큰이 만료되기 전에 유출되어 악의적으로 사용할 수 있다.

이에 대비하여 백엔드로 전달되는 모든 데이터에 httponly flag를 붙일 수 있다. 자바스크립트를 사용한 document.cookie의 사용을 막는 것이다.


 
SQL Injection 공격이 무엇이고, 방어하는 방법을 설명해주세요.

임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위로 prepared statement를 사용하여 변수를 문자열로 바꾸는 과정을 넣어서 방어할 수 있다. 
 
URL, URI, URN 차이가 뭘까요?

URL : User Resource Relocator

자원의 위치를 알려주기 위한 규약으로 scheme, domain, port, path 등으로 네트워크상의 자원을 표기하는 방법이다.

URN: 리소스에 이름을 부여하는 방법인데 파일마다 파일 경로에 따른 이름이 있는 것과 같다. URL마다 URN이 있다고 볼 수 있는데 이름으로 부여하면 찾기가 힘들기 때문에 거의 사용하지 않는다. 

URI: User Resource Identifier 

자원의 식별자로 Url, Urn의 상위 개념. URL과 살짝 다르게 URI는 자원의 식별자이므로 파라미터나 앵커들도 모두 포함하는 개념이다.

 
프록시 관련 참고 https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/

프록시 서버(정방향 - 포워드 프록시)

클라이언트 앞단에 있는 서버로 
웹 사이트 접속을 대행한다. 클라이언트 웹브라우저에서 직접 웹서버로 요청을 보내는 것이 아니라 프록시 서버로 리퀘스트를 보내게 되고, 프록시 서버는 지정된 웹서버에게 http 리퀘스트를 보낸다. 리스폰스를 보낼 때도 원번 서버가 보낸 리스폰스를 프록시 서버가 가로채가기 때문에 원본 서버는 특정 클라이언트와 직접 통신을 하지 못한다. 
x-forwared-ip  등이 이러한 프록시 서버를 경유한 실제 클라이언트 아이피를 얻기 위한 헤더로 알고 있음.
cors를 해결할 때 프록시 설정을 해보았다. nextjs의 rewrite 설정!!!! 아 대박... 맞네 이거네..
 
리버스 프록시


웹서버 앞단에 위치하는 서버 - 클라이언트가 웹 서버에 직접요청을 할 때 역방향 프록시 서버가  요청을 가로채기 때문에 모든 클라이언트는 원본 서버와 직접 통신하지 못한다. 
- 사용예) URL 단위의 배포에서 역방향 프록시를 구성해, SSR이 구성된 URL과 아닌 URL을 리버스 프록시에서 구별하여 원본 서버에 호출한다는 것이 인상적.
https://d2.naver.com/helloworld/2177909
 - 사용예2) WAF (웹 애플리케이션 방화벽) 및 XSS, 역방향 프록시 | Cloudflare

 
L7 로드 밸런서

scale out - 여러대의 서버가 나누어 일을 하도록 로드밸런서가 요청을 분산해준다.

L4(트랜스포트층)은 서버 A. 서버 B로 요청을 나눠준다면, L7은 path에 따라 /category /til  등에 따라 요청을 나누어준다.
 
커넥션 타임아웃 리드 타임아웃
맛집 비유 있었는데..
맛집에 들어가려고 웨이팅하는데 줄 넘 길어서 나오는 게 커넥션 타임아웃
들어가서 메뉴판 고르고 메뉴 너무 안 나와서 나오는 게 리드 타임아웃