HTTP

웹 상에서 클라이언트와 서버 간에 하이퍼미디어 문서를 교환하는 기본적인 통신 방식으로 header와 body로 구성된 메세지를 통해 정보를 교환한다.

웹 브라우저와 웹 서버간 데이터 통신을 위한 기본적인 프로토콜로 해당 프로토콜로 데이터를 전송할경우 암호화가 진행되지 않은 평문 데이터를 주고받는다.

HTTPS

HTTP에 Secure가 붙은것으로 보안계층(SSL/TLS)를 추가한 프로토콜이 데이터 통신을 암호화하여 진행한다.

1. 내가 웹사이트에 보내는 정보를 훔쳐보지 못하도록 암호화(보안계층에서 진행)를 진행한다. (클라 -> 서버 또는 반대의 방향에서 이를 방지하게된다.)

2. 서버 신원 확인을 진행하여 신뢰 가능한 사이트인지 확인이 가능하도록 해준다. (검증된 사이트만 Secure이 붙게 된다)

대칭키, 비대칭키

대칭키

하나의 동일한 키를 활용해 양쪽 모두 데이터를 암호화,복호화를 진행하는것

하지만 데이터를 처음 보낼때 해당 대칭키에 한 정보를 보내야하는데 이때 시점에서 키가 노출될경우 암호화의 의의가 사라지게된다.

 

비대칭키(공개키)

주고받는쪽이 데이터를 암호화, 복호화를 진행할때 서로 다른 키(공개키, 개인키)를 사용하는 경우 서로 한쌍이지만 서로 다르기때문에 비대칭키 라고도 불리운다

개인키를 서버가 보관하고 웹상엔 공개키를 사용해 해당 키를 뿌려버린다

공개키로 암호화 할경우 개인키로만 복호화가 가능해지며 반대의 경우도 마찬가지다.

즉, 서로 데이터를 주고받을경우 갖고있는 공개키로만 데이터를 풀어볼수 있기에 이를 통해 내가 요청한 사이트인지 확인이 가능하다.

서버의 신원을 확인하기 위해서 서버가 자신의 개인키로 서명한 인증서를 클라이언트에 제공하고 클라이언트는 서버의 공개키로 이를 검증한다.

 

HTTPS의 공개키가 정품인지 확인을 위해선 각각의 브라우저에 내장된 CA가 확인한다.

 

핸드셰이크 과정

1. 클라 -> 서버에 무작위 데이터 전송 - 클라가 지원하는 TLS버전, 랜덤값, 암호화 방식 목록 전송

2. 서버 -> 클라에 무작위 데이터 및 서버 인증서 전송 - 선택된 TLS 버전 및 암호화 방식, 서버 랜덤값 

3. 클라는 서버가 제공한 인증서의 서명을 검증(브라우저는 CA 인증서 목록을 내장하며 CA의 개인키로 인증서에 서명이 되어있으며 클라이언트는 CA의 공개키로 서명을 검증)

4. 문제가 없을경우 클라이언트는 클라이언트와 서버의 서로 공개키를 사용해 세션키를 생성, 해당 키를 통해 통신을 암호화한다.

 

 

SSL/TSL

대칭키와 비대칭키 방식이 혼합되어서 사용된다.

비대칭키 방식으로 암호화 및 복호화를 진행하는건 대칭키로 할떄보다 부담되며 비 대칭키 방식으로 메세지를 암호,복호화 할경우 

데이터는 대칭키로 암호화를 진행하며 대칭키를 공유할때 비대칭키를 사용한다.

1. 암호화 (도청방지)

2. 통신내용 변경 방지 (위조방지 -> 메시지 인증 코드(MAC) 또는 해시 함수를 통해 변경여부 검)

3. 신뢰 가능한 사이트인지 확인(피싱방지 -> CA)

 

SSL, secure Sockets Layer  (보안소켓계증) -  디지털 인증서라 불리우며 사용자와 서버 (웹사이트) 사이의 보안소켓 계층을 의미한다 (현재는 TLS로 대체되었다)

TLS, Transport Layer Security  (전송 계층 보안) - HTTP에 보안계층을 추가한것으로 HTTP를 TLS로 암호화한것

 

CA (Certificate Authority)

클라이언트가 접속하려는 서버가 실제로 의도한 서버인지(신뢰 가능한 서버인지) 확인 해주는 민간업체로 서버에 대한 디지털 인증서를 발급한다.

'CS' 카테고리의 다른 글

코딩 용어모음  (0) 2024.08.23
JS파일 가져오기 로컬, 원격 차이  (0) 2024.08.03
크로스 도메인,SOP, CORS, XSS,  (0) 2024.01.25
IP, DNS, HTTP  (0) 2023.07.09
HTTP 헤더  (0) 2023.05.06

작성중이며 수시로 업데이트 하고있습니다

(언젠간..전부 포스팅 예정..)

 

가수 - 곱해지는수 (EX : 2⁴ 에서 2)

객체 (Object) - 모든클래스의 조상 (부모가 없는 클래스는 컴파일러가 자동적으로 object 클래스를 상속도록 만든다)  

가상돔 (Virtual DOM) - 실제 DOM에 접근하여 조작하지 않고 추상화한 JS객체를 구성하여 사용 많은 데이터를 사용하는 대규모 웹에서 사용(CSS 재연산, 레이아웃구성 등의  

공유 메모리 모델 - 복수의 프로세스가 커널을 통해 주소공간의 일부를 공유하도록 요청하며 한번 설정되면 어떤 프로세스나 읽기쓰기를 진행할수 있다..

기법 (Mechanism) - OS의 설계에서 OS가 어떤 방식을(기능을) 담당할건지 결정하는것

결합도 (Coupling) - 모듈이 다른 모듈에 의존하는 정도

고정소수점 - 실수표현방식의 일종으로 현재는 부동소수점 방식을 더 사용한다.

가상화 (Virtualization) - 단일 컴퓨터(1개의 시스템)에서 여러 시뮬레이션 환경 및 전용 리소스를 사용하는 기술 (운영체제가 다른 운영체제내에서 사용하는것 -> 물리적 하드웨어에 구현됨)

강제타입변환 (Casting) - 강제로 타입을 다른타입으로 변환하는것

자식타입이 부모타입으로 자동변환시 부모타입 선언된 필드 및 메소드만 사용가능/부모타입 자식클래스로 강제 변환이 가능한건 아니다)

개방 폐쇄 원칙 (Open Closed Priciple, OCP) - OOP 5대원칙 중 하나로 확장에 열려있어야하며(추상화된걸 구현할수 있어야하며) 수정엔 닫혀있어야 한다. (추상메서드의 수정은 금지된다)

가상회선 식별번호 (VCI, Virtual Circuit Identifier) - 가상회선 방식에서 패킷을 전송할경우 보내는 패킷마다 자신의 순서를 명시하기 위해 만들어진 번호

기아상태 (Starvation) - 특정 프로세스의 우선순위가 낮아 자원을 할당받지 못하는 상태

경합조건 (race Condition) - 2개 이상의 명령어가 동시에 돌아갈경우 그들 사이의 경쟁으로 인해 수행 결과를 예측할수 없게되는것

논블로킹 (Non-Blocking) - 호출된 함수가 자신의 일을 마치지 않았더라도 바로 제어권을 호출, return하여 호출된 함수가 다른일을 할수 있도록 하는것(될때까지 딴거하고있어!) <-> 블로킹

난독화 (Code Obfuscating) - 코드를 읽기 어렵게 변환하는 작업으로 소스코드 난독화, 바이너리 난독화 2가지로 분류한다.

Null - 참조하지 않는다는 뜻이며 Null자체로 초기값을 갖는게 가능하기에 Null로 초기화된 변수는 스택영역에 생성된다.(배열도 Null값을 가질수 있다)

네이티브 앱 - 각 OS에 맞는 앱을 개발하는 방법

네임스페이스 (namespace) - 네임스페이스라는 소속 공간(한 코드)에 따라서 변수나 함수가 같은 이름임에도 다른 식으로 구분이 될 수 있는것

다형성 (polymorphism) - 1개의 객체가 여러가지 타입을 가질수 있는것 -> 오버로딩, 오버라이딩, 함수형 인터페이스가 예시

데드코드 (Dead Code) - 실행되지 않을 불필요한 코드

동적다형성 - 실행할 메서드가 런타임에 결정되는것으로 주로 @Override를 통해 결정되며 재사용 가능한 코드가 많으나 이로 인해 약간의 오버헤드가 발생한다 <-> 정적다형성

동적바인딩 (Dynamic Binding) - 실행 시간에 이름과 구현이 연결되는것 -> 프로그램의 유연성이 증가되나 오버헤드가 발생될 우려가 잇다. (가상함수의 오버라이딩, 인터페이스 호출 등)

(DOM, Document Object Model) - 웹페이지를 이루는 태그들을 JS가 이용할수 있게끔 브라우저가 트리구조로 만든 객체모델 (문서객체모델)

동일출처정책 (SOP, Same Origin Policy) - 동일한 출처의 접속만 리소스에 접근하도록 제한하는것 

덤프 (Dump) - 장애가 발생했을때 문제가 발생한 상태를 기록매체에 덮어씌우는것

데몬 (Deamon) - 사용자의 직접적인 제어 없이 서비스의 요청에 응답을 위해 백그라운드에서 여러 작업을 진행하는 프로그램

동적 (Dynamic) - 상황에 따라 실시간으로 변하는 상태로 클릭하면 움직이는 화면, PC에서 창 크기를 줄였을떄 이에 맞도록 컨텐츠의 사이즈가 줄어드는것

디버깅 (Debugging) - 버그잡기(에러 찾아서 고치기..)

동적링킹 (Dynamic linking) - 실행가능한 목적파일을 만들때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지않고 해당 모듈의 주소만 갖고있다가 런타임시 링킹이 이뤄질때 해당 주소로 가서 필요한것들을 들고오는 방식 (필요한것만 가져오는 방식)

동기 (synchronous) - 요청과 결과가 동시에 일어난다(시간이 얼마나 걸리든지 요청한 자리에서 결과가 주어져야한다 - 편의점에서 계산을 맡길경우 계산이 완료될때까지 기다린다.) <-> 비동기 

더티체킹 (Dirty Checking) -

도메인 (Domain) - IP대신 사용하는 웹사이트 접속 주소 (132.204.123.143 대신 www.naver.com로 이것을 연결해 주는 시스템은 DNS(Domain Name System)이라고 한다

단일 책임 원칙 (Single Responsibility Principle, SRP) - OOP 5대원칙 중 하나로 객체는 1개의 책임(기능)만 가져야한다

동등성 (Identity) - 같은 내용을 갖고있는 객체 (값이 같은지? equals()메서드로 boolean여부를 반환 )

동일성 (Equality) - 동일한 오브젝트(같은 레퍼런스)를 바라보고있는 객체 (주소가 같은지? - hashcode()메서드로  )

디폴트메서드 (default) - 메서드 앞에 접근제어자(public, private 등)을 붙이지 않는 경우 디폴트 메서드로 인식된다.

(접두에 자동적으로 붙는것이며 구현 객체가FURL 필요하다)

 

리터럴 (Literal) - 변수에 넣는 데이터 (코더가 값을 넣은것을 의미하기도 한다)

런타임 (RunTime) - 컴퓨터 프로그램이 실행되는 동안의 동작

렌더링 (Rendering) - 서버로부터 요청해서 받은 내용을 브라우저 화면에 표시해주는것

리플렉션 (Reflection) - 클래스의 메타 정보를 얻는기능을 의미 (클래스의 필드는 무엇인지, 생성자를 갖고있는지 등)

롤백 (Roll Back) - 오류가 났을경우 오류가 발생하지 않은 직전의 버전으로 되돌리는것

로컬 클래스 - 메서드 내부에서 선언한 중첩클래스로 메서드 실행이 끝나도 힙 메모리에 존재한다 (접근제한자,static 접두 불가 -> 로컬에서만 사용하는 LV이기 때문에 붙이면 로컬이 아니게 된다.)

라우트(Route) : 경로, 서로 다른 네트워크 간 데이터를 전송하고 전송한데이터를 받는 경로

라우터(Router) : 인터넷 공유기를 떠올리자, 라우터는 한개의 인터넷 회신을 여러개의 네트워트가 사용할 수 있도록 쪼개주는, 중계 역할을 해주는 장치다.

라우팅(Routing) : 엔드 포인트(URI, 경로)의 정의, 해당 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방식이다.

로더 (Loader) - 링커 또는 외부 기억장치로부터 주기억장치로 옮기기 위하여 메모리 할당 및 연결, 재배치 ,적재를 담당하는 서비스 프로그램 

로그레벨

  • Fatal(매우심각, 프로그램종료)
  • Error(의도치 않은 에러, 프로그램 미종료)
  • Warn(에러 발생 가능성 보유)
  • Info(개발자가 의도한 에러 및 요구사항에 따른 동작을 보여줄때)
  • Debug(Info 레벨보다 더 자세한 정보가 필요한 경우 Dev환경)
  • Trace(Debug보다 자세함, Dev환경에서 버그를 해결하기 위해 사용)

레지스터 (Register) - CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치

링킹 (Linking) - 컴파일러가 만들어낸 하나 이상의 목적 파일(우리가 작성한 코드 덩어리)과 라이브러리를 이를 실행 프로그램(exe 등)으로 병합하는것으로 동적링킹, 정적링킹이 있다. (해당 작업을 진행해주는 프로그램은 링커라 한다.)

링커 (Linker) - 컴파일러가 만든 1개 이상의 목적파일(소스코드)을 가져와 단일 실행 프로그램으로 병합하는 프로그램으로 심볼해석 -> 재배치의 순서를 거친다.(컴파일러가 원시코드를 파일로 생성하면 이 파일과 라이브러리 등 다른 파일들을 결합하여 exe 같은 프로그램을 생성)

래퍼클래스 (wrapper class) - 객체로 사용하기 위하여 사용(포장)해주는 클래스

로컬 변수 (Local value) - 메서드 내부에서만 유효한 변수 (메서드 종료시 사라진다)

리스코프 치환 원칙 (Listov Substitution Priciple, LSP) - 서브타입은 언제나 부모타입으로 교체할수 있어야한다.

루핑 (Looping) - 요소 전체를 반복하는것 (peek() - 중간처리 메서드, forEach() - 최종처리 메서드 2종류가 있다)

메소드,메서드 (method) - 객체의 동작에 해당하는 실행블록으로 함수와 비슷한것 (함수와의 차이점은 클래스 내부에 정의한 함수. -> 즉, 독립적으로 존재하는게 함수, 클래스 내부에 종속된게 메서드)

메소드 추출 (extract method) - 리팩토링에서 공통된 메소드를 추출하는것

마이그레이션 (migration) - 복수의 시스템이 갖춰진 환경에서 더나은 시스템으로 옮겨가는 과정 (OS, 

모놀리식 구조 (Monolithic) - 가장 간단한 OS구조로 최소한의 자원으로 최대의 기능을 제공하며 인터페이스와 기능계층이 잘 분리되어 있지 않다 (기능을 1개에 다 때려박은 단일 코드 덩어리라 생각하면 된다).

모놀리식 아키텍처 - SW의 모든 구성요소가 한 프로젝트에 통합된 형태로 단일 서비스로 실행

마운트 (Mount) - 디스크 등 물리적인 장치를 디렉터리에 연결시켜주는것

무한버퍼 (Infinite Buffer) - 공유 메모리 시스템의 프로세스간 통신에서 사용되는 개념으로 소비자는 항목을 기다릴순 있으나 생성자는 기다릴 필요가 없다  <-> 유한버퍼

메소드 영역 - 코드에서 사용되는 클래스들을 클래스 로더로 읽어 런타임상수풀,필드데이터, 메소드데이터, 메소드 코드,

생성자코드를 저장하며 JVM이 시작할때 생성되며 모든 스레드가 공유하는 영역이다.

메타데이터 - 컴파일 과정과 실행 과정에서 코드를 어찌 컴파일할것인지 알려주는 정보

매핑 (Mapping) - Key역할을 하는 데이터를 다른 데이터에 대응시켜 저장하는것

모듈 (module) - 프로그램을 구성하는 요소로 관련된 데이터와 함수를 1개로 묶은 단위를 의미한다.

멱등성(idempotent) - 연산을 여러번 적용해도 결과가 바뀌지 않는것으로 SW에선 몇번을 호출해도 결과가 동일해야 멱등하다고 이야기한다. -> 연산을 여러번 반복해도 한번 수행것과 같은 성질

멀티플 도메인 인증서 - 메인 도메인 이름을 비롯해 최대 99개까지의 대체 도메인 이름을 보호할수 있게 해준다 (통합 커뮤니케이션 인증서라고도 한다)

멀티 프로그래밍 (Multi Programming) - 1개의 프로세서가 1개의 프로세스를 실행하는동안 타 프로세스에 접근할수 있도록 하는것 (논블로킹방식)

메모리덤프 - 컴퓨터 프로그램이 특정 시점에 작업중이던 메모리 상태를 기록한것

멀티태스킹 - 같은 시간에 여러개의 프로그램을 띄우는(돌리는) 시분할 방식

바이어스 (Bias) - 부동소수점에서 지수의 부호 구분을 위한것

바이오스 (BIOS, Basic Input/Output System) - OS중 가장 기본적은 SW로 컴퓨터 입출력을 담당하는 펌웨어이다.

백그라운드 프로세스 - 

바이너리 암호화 (Binary Encryption) - 소스코드의 난독화가 아닌 디컴파일 자체가 불가능하도록 바이너리 자체를 암호화하는것으로 키가 있어야만 해독이 가능하다.

복호화 (디코딩) - 부호화된 데이터를 부호(코드)화 되기 전에 형태로 바꿔 사람이 읽을수 있는 형태로 되돌리는것

바이너리 로그 - DB복구에 주로 사용??

부하 테스트 (LoadTest) - 성능 테스트 및 성능 튜닝이 어느정도 완성되면 이것이 HW/SW 환경에서 얼마나 많은 사용자가 동시에 사용가능한지 테스트하는것을 의미한다.

백업 (Backup) - 데이터 손상, 손실을 대비해 저장하는 데이터의 사본 - 데이터의 복원이 주요목적으로 원본 삭제X

복원 (Restore) - 단일 파일, 서버 DB를 복원하기 위한 목적으로 특정 시점을 기준으로하여 이뤄진다 (어느시점인지 알아야한다)

블루/그린(Blue/Green) 배포 - 2개 이상의 인스턴스를 사용할때 신규 버전을 배포하는동안 로드밸런서를 이용해 기존 버전이 실행되는 인스턴스로 트래픽을 보내는 형태의 배포

부트블록 (Boot block) - OS부팅을 위해선 메모리 적재가 필요한데 이에 필요한 코드를 저장되어있는 디스크영역 (부트 섹터라고도 한다)

브로드캐스트 (Broad Cast) - 자신의 호스트가 속해 있는 네트워크 전체를 대상으로 패킷을 전송하는 일대다 통신방식

블랙박스테스팅(Black Box Testing) - SW테스트 방법중 1개로 SW 내부구조나 작동원리를 모르는 상황에서 기능을 테스트하는 방법

바인딩 (Binding) - 실제 구현에 연결하는 과정으로 프로그래머가 코딩을하여 컴파일을 할경우 프로그래머가 값을 변경할수 없는 상태 (정적바인딩, 동적바인딩)

바이너리 (Binary) - 2조각, 2부분으로 컴퓨터에선 이진파일을 의미한다 (0,1)

빌드 - 코드를 컴파일과정을 통해 (오브젝트 파일생성 -> 링킹 -> 라이브러리파일)로 만드는것 

병목현상 (Bottle neck) - 전체 시스템 성능이 다른 구성요소로 인해 제한받는것(2인 3각인데 두 선수의 기량차이가 다르다면 높은쪽이 낮은쪽에 맞춰서 가는것)

버퍼 (buffer) - 데이터를 한곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는메모리의 영역 (I/O에서 는 CPU와 보조기억장치 사이에서 사용되는 임시저장공간을 의미하며 큐(Queue)라고 하기도 한다, 유튜브 영상볼때 미리 서버에서 받아온 데이터를 보관하는 부분은 하얗게 표시되는데 이것도 버퍼의 일종이다)

버스 (Bus) - 컴퓨터 부품 또는 컴퓨터간 데이터와 정보를 전송하는 통로

버퍼링 (Buffering) - 입출력시 CPU의 속도와 입출력 장치간 속도차이를 해소하기 위해 하드디스크, 메모리 영역에 자료를 잠시 저장해놓는것

분할 컴파일 - 실행파일을 만들기위해 소스파일을 여러개로 나눠 개발하는 방식

비선점형 OS - 프로세스가 CPU를 할당받았을때 그것이 자발적으로 중지되기 전까지 계속 실행되도록 보장 (이거먼저 끝내고 해라)

부동소수점 - 고정소수점의 정확한 값을 표현하지 못한다는 문제점을 보완한 방식

블로킹 (Blocking) -  작업완료 통보 방식 중 하나로 작업결과물이 아닌 작업이 완료될때까지 기다리는것(선행작업이 끝날때까지 제어권은 갖고있는 상태로 호출한 함수에게 바로 return하지 않는것 - 할때까지 기다려!) <-> 논블로킹

비동기 (Asynchronous) - 요청과 결과가 동시에 일어나지 않는것(요청한 자리에서 즉시 결과가 주어지지 않으며 결과가 나오기까지 대기시간동안 다른 요청의 처리가 가능하다 - 편의점에서 계산을 맡길경우 계산이 완료될때까지 기다린다. <-> 동기

박싱 (Boxing) - 기본자료타입을 래퍼클래스로 변환하는 작업으로 100만건 작업 기준 오토박싱 진행시 5배가량 성능 차이가 발생한다 (Integer 객체명A = new Integer(정수 또는 객체명B) <-> 언박싱 

생성자 (Constructor) - 객체 생성시 초기화 담당 (new연산자로 호출되는것)으로 생성자이름은 클래스 이름이며 return값이 없다.

스네이크 케이스 (snake_case) - 전부 작은 글씨로 쓰면서 중간의 공백은 "_" 로 쓰는것

스니핑 (sniffing) - 네트워크에서 다른 상대방의 패킷교환을 엿듣는것 (네트워크 트래픽을 도청하는것)

스트레스 테스트(Stress Test) - CPU,RAM,DISK등 환경이 갖춰지지 않은 어플리케이션에 비정상적으로 높은 부하를 걸어 한계 테스트를 진행해보는것 (시스템 레벨에서 결함을 예상하는것)

슬로우 쿼리

시멘틱 (Semantic) - 이것이 화면에서 어떻게 보여질까?가 아닌 이 코드의 의미, 즉 역할은 무엇이며 기능은 무엇인가를 나타내는 것(가격을 정의할떄 a=1000보단 price=1000 이 더 시멘틱 하다고 표현한다) 

세션 - 사용자와 서버간의 관계가 기억 및 보존되는 상태로 브라우저를 닫아 서버간 연결을 끝내는 시점까지를 의미한다. (방문자가 웹 서버에 접속한 상태를 한개의 단위로 보며 쿠키와 달리 서버의 자원을 사용한다)

선형 큐 (Linear Queue) - 일자로 구성된 큐(Queue)로 데이터처리가 진행되면 뒤쪽으로 한칸씩 밀려나지만 앞쪽은 공란인인 문제가 생긴다.  

스레드풀 - 스레드의 집합을 미리 생성해두고 관리하는방식으로 웹 서버에서 클라이언트의 요청을 처리할때 각 요청을 별도의 스레드에서 처리가능 

스마트 캐스트 (Smart cast) - 변수의 값이 실수일때도 정수일때도 있는데 이것을 컴파일러 혼자 값으 타입을 검사한후 이것을 자동으로 캐스팅을 하는것

샌드박스 (Sandbox) - 외부로부터 들어온 프로그램이 보호된 영역에서만 동작해 시스템의 부정조작을 막는 보안형태

상대경로 - 현재 위치를 기준으로 경로를 가리키는것 (./window -> 여기서 .은 상위폴더를 가리킨다)

서버 사이드 렌더링 (Server Side Rendering, SSR) - 클라이언트(브라우저)가 서버에 매번 데이터를 요청하여 서버에서 처리하는 방식

스키마 (Schema) - DB의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합 (

(Shell) - OS에서 커널과 사용자간 명령을 해석하기 위해 필요한 인터페이스를 제공하는 (인터프리터)프로그램으로 실제로 명령어를 전달하고 결과를 전달받는 프로그램 (명령 줄셸(CLI)과 그래픽 셸(GUI)이 있다)

셸 스크립트 (shell script) - 셸, 명령줄 인터프리터에서 돌아가도록 작성된 1개의 OS를 위해 쓰인 스크립트

시프트연산 (shift operator) - 비트 연산자중 1개로 비트값을 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산자이다.

시스템 콜 (System Call) - 프로그램이 작업을 하려고 하는데 자신만의 권한으로 실행할수 없는경우 OS에게 부탁하는것으로 커널함수를 호출하는것이다.

소켓 - 통신을 진행할때 양쪽이 갖고있어야하는 부품, 전화기의 역할 (브라우저에서 쌍방간 통신할때 필요한것 -> 웹소켓

// JAVA는 연결기반(TCP), 비연결성(UDP) // 스프링은 자체 웹소켓지원 API 제공 )

스풀링 (Spooling) - 프린터 등이 병렬 수행 프로그램이 사용할수 있도록 도와주는 방법 -> 하드디스크에 공간을 확보하여 프린터로 전송될 데이터를 먼저 받아서 저장해두면 프린터는 혼자 작동하고 그동안 CPU는 다른일을 할수 있게 된다 (재료투입구에 재료를 넣어놓고 다른것 하는것)

시퀀스 (Sequence) - 저장순서를 기준으로 찾는다

스와핑 (swapping) - 프로세스 할당이 끝나면 보조 기억장치로 프로세스를 보내고(스왑아웃) 새로운 프로세스를 메모리에 적재하는것 (스왑인)

선점형 OS - 프로세스가 CPU를 할당받아 실행중이라도 다른 프로세스가 기진행중인 프로세스를 중지하고 CPU를 강제로 점유할수 있다 (하던거 멈추고 다른거 부터 할수있다) 

스택트레이스 (Stack Trace) - 프로그램이 시작된 시점부터 현재 위치까지의 메서드 호출목록 (JVM이 자동으로 생성 -> 예외가 발생한 위치 확인가능)

싱글 도메인 인증서 - 한개의 도메인 또는 그 서브 도메인을 위해 발행되는것 

삼항연산자 (?:) - if에서 발전된 문으로 "조건식 ? 값(true) : 값(false)" 형식이다.

                            (EX :  int b = (5 < 4) ? 50 : 40;   //b는 50이 들어간다)

스택 (Stack) - 쌓아놓은 더미 라는 뜻으로 이전에 사용되던 데이터 등이 보관되는 장소로 저장방식은 후입선출 방식 (복수의 클립보드 같은것)  (EX : int a = 5; 일때 a의 값은 스택에 저장된다)

시분할 시스템 (Time Sharing System, TSS) - 여러명의 사용자가 사용하는 시스템에서 컴퓨터가 사용자들의 프로그램을 번갈아가며 처리하는것 (라운드 로빈 방식이라고 하기도 한다)

시분할 기법 (Time-shared) - 아주 짧은 시간 간격을 두고 여러 프로그램을 전환하며 실행 (전환은 OS가 담당, 멀티태스킹, 멀티스레드를 가능하게하는 기법)

상수 (Const) - 참조변수 메모리의 주소값이 변하지 않는다는 의미 (그 주소가 가리키는 데이터들은 변할 수 있다)

싱글톤 (Singleton) - 단일객체 생성을 보장하며 여러 스레드의 요청이 들어와도 객체는 오직 1개임을 보장 (new연산자 사용시 생성자를 호출한 만큼 객체가 생성되는데 이를 방지)

인증 - 실제 사람이 맞는지 확인하는것 (내방객분 예약하신 성함이 어찌되실까요?)

인가 - 권한이 있는지 확인하는것 (내방객분 출입권한은 있으신가요?)

인스트럭션 (instruction) - 컴퓨터에게 일을 시키는 단위로 명령부(OP)와 처리부(Operand)로 구분됨

암호화 (Encryption) - 보안 유지를 위해 데이터를 읽을수 없는 형식을 바꾸는것으로 키가 있어야 해독이 가능하다

언패킹 (Unpacking) - 패킹된 소스코드를 보기위해 암호화나 압축을 푸는행위

이스케이프 시퀀스 (escape sequence) - 표현할수 없는 문자나 기능을 표현해주는 역할 (제어 시퀀스, 확장 비트열, 이스케이프 문자라고도 한다 - \n, \\, \"...)

웹 표준 - 브라우저마다 다른 코드의 실행방식을 통합해 정한 규칙 (W3C) 

엣지케이스 (edge case) - 알고리즘이 처리하는 데이터값이 알고리즘 특성에 따른 범위를 넘을경우 발생 (int 

원형 큐 (Circular Queue) - 선형큐의 단점을 보완해서 나온 큐(Queue)로 이동에 따라 front 또는 rear가 이동하며 Front가 큐의 끝에 도달하면 큐의 맨앞으로 자료를 보내 원형으로 연결하는 방식

온프레미스 (on-premise) - 사내 전산실에서 자체적으로 서버를 구축, 관리하는것

아카이브 (Archive) - 보관, 참고용으로 생성한 데이터의 사본으로 일부 과거의 일부데이터 회수가 주요목적 -> 원본 데이터 삭제가 종종 있다.

유한버퍼 (Finite Buffer) - 공유메모리 시스템의 프로세스간 통신(IPC)에서 사용되는 개념으로 버퍼가 고정되있다고 가정하여 버퍼가 비었을경우 소비자는 무조건대기, 모든 버퍼가 채워져있으면 생산자는 대기오버플로가 발생할 우려가 있으며

데이터손실, 전송지연 등 문제가 나타날수있다. 

암묵적 스레딩 (implicit Threading) - 프로그램, 시스템이 자동적으로여러 스레드를 활용해 병렬로 처리하는것 (스레드풀)

인픽스 (infix) - 2개의 피연산자 사이에 연산자가 존재하는것 (a+b)

운영체제 (OS, operating system) - HW가 컴퓨터 시스템 운영(조작)을 도와주는 SW

응집도 (Cohesion) - 모듈안의 요소들이 함께 속하는 정도 (메소드, 클래스의 데이터간 강도 등)

인라이닝 (Inilning) - 호출 부분을 함수 전체 코드로 치환하여 컴파일한다. 

아키텍처 (Architecture) -  1개의 서비스가 어떻게 구성되며 어떤 원리로 돌아가는지 설명하는 틀 또는 설계도 (ISO 규격, 청사진같은 개념으로 이해하면 된다 -> ISO 7001 규격에 맞춰서 작성했다)

의존 (Dependence) - 객체끼리 서로 참조등으로 A를 실행하기 위해선 B가 필요한경우 A는 B에 의존한다고 한다 (내가 메세지를 보내기 위해서는 카카오톡이 필요하다 -> 내가 메세지를 보내는 행동을 위해선 카카오톡이 필요(의존)한다)

의존성주입 (Dependency Injection, DI) - 클래스 외부에서 의존되는것을 대상 객체의 IV에 주입하는것 (프로그램 디자인이 결합도를 느슨하게 되도록 의존관계역전(DIP) 및 단일책임원칙(SRP) 을 따르도록 클라이언트의 행위를 분리하는것)

오버헤드 (Overhead) - 어떤 처리를 하기위해 들어가는 간접적인 처리시간, 메모리 등

익명함수 (Anonymous Function) - 함수의 이름이 없다는 뜻으로 익명함수는 모두 일급객체로 취급된다.

에뮬레이션 (Emulation) - 1개의 시스템이 다른것을 흉내내는것으로 A에서 구동되나 B에서 구동불가시 B가 A의 동작을 에뮬레이션(흉내) 한다 (실제로 B가 A를 구현한것은 아님)

인터럽트 서술자 테이블 (IDT, Interrupt Descriptor Table) - 인터럽트 처리를 위해 서비스 루틴을 함수로 구현해놓고 각 함수의 시작점을 등록해놓은 테이블

일급객체 (First-Class Object) - 변수나 데이터에 할당할수 있어야하며(메서드에 데이터를 담을수 있어야하며) 파라미터 및 반환값으로 사용이 가능한(return method()) 객체

언박싱 (Unboxing) - 래퍼클래스를 기본자료타입으로 변환시키는 과정 <-> 박싱

인터렉션 (Interaction) - 2 이상의 물체 또는대상이 서로 영향을 주고받는 일종의행동

예외 (Exception) - 코드로 수습할수 있는 미약한 오류 (실행은 됩니다!)

오류(Error) - 코드로 수습 불가능한 심각한 오류로 수습이 안되니 일단 종료시키는것이다. (실행도 안됩니다!, 가장 자주 나타는 오류는 OM이다.

인터럽트 (interrupt) - 특정 기능을 수행하던 도중에 작업을 멈춰달라고 요청하는것으로 InterruptedException를 활용 (오류발생으로인한 종료, 정상적인 방법에 의한 종료, 작업을 취소하는경우의 종료, CPU엔 인터럽트 라인이 존재한다.)

인터럽트 벡터 (Interrupt vector) - 인터럽트 발생시 그 인터럽트를 처리할수 있는 서비스 루틴의 시작주소를 갖고 있는 공간으로 컴퓨터전원이 켜질때 OS는 인터럽트 벡터값을 초기화를 진행한다.

인터프리터 (interpreter) - 고급언어로 작성된 프로그램을 한줄단위로 읽고 실행시키는 프로그램 (목적프로그램 미생성, 속도느림, CPU낭비 큼 //파이썬, APL 등)

엘리먼트 (element) - 어노테이션에서 사용하는 멤버 (외부의 값 즉, 리터럴을 입력받는 부분)

와일드카드 - *,?으로 포인터 및 3항 연산자를 뜻하는게 아니며 해당 파일, 텍스트를 찾을떄 못찾겠다면 해당 문자를 넣는 형식 (프로?래밍 -> 프로구래밍,프로그래밍, 프로기래밍 등 출력 ||||| 프로* -> 앞의 2글자가 "프로"로 시작하는 모든것 출력)

유니코드 (Unicode) - 코드 테이블 인덱스값으로 모든 문자에 대하여 유니크한 넘버를 부여한것이다 (유니코드는 플랫폼,OS,언어에 독립적이다)

인터페이스 분리 원칙 (Interface Segregation Principle, ISP) - OOP 5대원칙 중 하나로 큰덩어리의 인터페이스를 작은단위로 분리시켜 필요한 메서드만 사용하게 해야한다. 

의존 역전 원칙 (Dependency Inversion Principle, DIP) - OOP 5대원칙 중 하나로 상위모듈(부모개체), 하위모듈(자식개체) 모두 추상화에 의존해야하며 상위모듈이 하위모듈에 의존하면 안된다.

인스턴스 맴버 클래스 - static 없이 선언된 클래스 (인스턴스 필드, 인스턴스 메서드만 선언가능 / 정적필드, 정적 메서드 선언불가)

익명클래스 - 이름이 없는 클래스로 정의와 생성을 동시에 한다 (new 조상클래스 또는 new구현인터페이스)

오버플로우 (Overflow) - 넘쳐흐른단 뜻으로 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류

오버로딩 - 동일한 메소드를 매개변수, 순서를 다르게하는것 (동명이인, 새로 만드는것)

오버라이딩 (Override) - 상속된 메소드(상위메서드)의 내용이 자식클래스(하위메서드)와 맞지않는경우 자식클래스에서 동일한 메소드를 재정의(수정)하는것(오버라이딩시 초기 상속된 부모메서드는 사라지므로 super를 활용해 부모메소드 재호출 할것)

어노테이션 (Annotation) - 애플리케이션에서 처리할게 아닌 컴파일 과정, 실행과정에서 코드를 어떻게 컴파일하고 처리할지 알려주는정보 - 메타데이터라고 볼수 있다

인터페이스 (Interface) - 객체의 사용방법을 정의한타입으로 자바의 람다식은 인터페이스의 구현개체를 생성한다 ->개발코드를 수정하지 않고 사용객체를 변경하기 쉽도록 하기위해서 작성 (4가지 특성 - 상수필드 - 상수 선언시 초기값 필요, 추상메소드 -매개값 및 리턴값만 알려준다,정적메소드,디폴트메소드 // 인터페이스 구현은 자식 인터페이스의 메소드와 그것의 부모인 인터페이스의 메소드까지도 모두 구현해야한다.)

인스턴스 -

인스턴스 변수 - 개별속성으로 들어가는 것엔 인스턴스 변수 (사람마다 다른 이름, 주민번호 등) <ㅡ> 클래스 변수 

웹 컨테이너 - jakarta의 서블릿과 상호작용하는 웹 서버 컴포넌트 중 1개로 서블릿의 수명주기 관리 및 URL 매핑을 확인하는 역할과 JSP파일, 서버측 코드를 포함한 기타유형 파일에 대한 요청을 처리한다

제어자 (modifier) - 클래스와 클래스의 맴버(맴버변수, 메서드)에 부가적인 의미 부여로 다중사용 가능 -> 접근제어자 이외의 것들(staic,final,abstract ...)

정적다형성 - 호출되는 메서드가 컴파일 시간에 결정되는 방식으로 성능상 이점이 제공된다(오버헤드 미발생  <-> 동적 다형성

정적 (Static) - 고정된 의미로 객체생성없이 사용가능한것으로 클래스의,공통적인 (정적멤버, 정적필드, 정적메서드)

정적 사이트 생성 (Static Site Generation, SSG) - 각 페이지를 빌드시점에 정적파일로 생성하고 클라이언트가 요청할때 이것을 넘겨주는 형식으로 CDN과 사용시 효율이 극대화된다.

정적 바인딩 (Static Binding) - 컴파일 시간에 이름과 구현이 연결되는것 (함수 오버로딩, 최종클래스, 메서드 호출 등)

정책 (Policy) - OS의 설계에서 OS가 무엇을(어떤 프로그램) 담당할건지 결정하는것

재배치 (Relocation) - 링커가 심볼을 해석하면 각 심볼의 참조는 1개의 심볼 정의(1개의 값)만 갖는것으로 목적프로그램을 실제 주기억 장소에 맞게 재배치하는것(상대주소를 절대주소로 변경)

절대경로 - 현재 위치하고 있는 경로와 상관없이 늘 같은 경로를 가리킴

정적링킹 (Static linking) - 실행 가능한 목적파일을 만들때 프로그램에서 모든 라이브러리 모듈을 복사하는 방식 (링커가 실행하며 모든 라이브러리를 복사하기에 중복이 발생한다)

정적메서드 (Static Method) - 객체생성 없이 직접 접근가능 ( class_name.method_name -> "클래스명","메서드명")

정적필드 (Static filed) - 객체 생성없이 직접 

정적 맴버 클래스 - static 키워드로 선언된 클래스 (모두 선언가능)

중첩 (Overray) - 당장 필요하지 않는 프로그램의 일부를 중첩으로 설정하는 방식 (필수 명령어,데이터만 적재하고 나머지는 메모리 중첩영역에 만들어 필요할때 그 공간에 적재 -> 창고 여유공간이라 생각하면 된다)

지수 - 제곱하는 부분 (EX : 2⁴ 에서 4)

자바 가상 머신 (JVM) -  Java 는 OS에 종속적이지 않다는 특징을 가지고 있는데. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java 를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다. 즉, 어떤 환경이든 똑같은 실행결과를 도출한

중첩클래스 (Nested Class) - 클래스 내부에 선언한 클래스 (불필요한 클래스 관계를 감춰 코드의 복잡성을 줄이는 목적 - 정적 맴버 클래스, 로컬 클래스,인스턴스 맴버 클래스)

중첩인터페이스 (Nested Interface) - 클래스 내부에 선언한 인터페이스 (해당 인터페이스와 관계를 맺는 구현클래스를 만들기 위해서 -> UI 이벤트 처리목적)

최상위 부호 비트 (MSB) - 비트를 2진수로 변환했을때 가장 큰값(맨앞에 있는값) 10110

최하위 부호 비트 (LSB) - 비트를 2진수로 변환했을때 가장 작값(맨뒤에 있는값) 10110

추상 (abstract) - 실체간 공통이 되는 특성을 추출한것 (게임에서 캐릭터마다 유닛, 건물마다 체력, 이름이 있는 공통된 특징을 추출하여 선언한것을 추상화 하였다 라고한다. - 체력, 이름이 있다는것만 알지 체력이 몇인지, 이름이 몇인지는 하위클래스에서 정의한다)

추상메서드 (abstract method) - 자식클래스에서 반드시 오버라이딩해야 사용가능한 메서드 (컴퓨터한테 강아지란 개념을 이해시킬때 강아지라는걸 선언만 해놓고 다리로 구분하는 집합에선 다리가 4개인것으로, 종별로 구분할땐 포유류로 구분해야 하듯이 개념을 추상적으로 해놓고 필요한곳에서 오버라이딩을 이용해 구현하여 사용하는것)

클래스 (Class) - OOP에서 특정객체를 생성하기 위하여 변수와 메서드를 정의하는 일종의 틀

클래스 변수 (Class Value- CV) - 주로 공통속성인 변수에 static을 붙이는 형태로 사용시 "클래스명.변수"형태 <ㅡ> 인스턴스 변수 

클라이언트 (Client) - 네트워크로 연결된 서버로부터 정보를 제공받는 컴퓨터 

클라이언트 - 서버 모델 - 서버가 한대 이상의 클라이언트에게 리소스를 제공하는 형식

클라이언드 사이드 렌더링 (Client-side Rendering, CSR) - 클라이언트가 입력한것을 수신해 데이터만 받은 상태에서 JS가 HTML로 만들고 이를 애플리케이션에서 해석해서 표시하는것

크로스 플랫폼  - 동일 소스코드로 여러 OS에서 동작하는 앱을 만드는도구 (페북,에버비앤비,인스타그램)

카멜케이스 - 앞은 소문자 뒤는 대문자 (leageuOfLegend)

쿠키 (Cookie) - 브라우저에 저장되는 텍스트 조각(사용자 정보)으로 탈취되어도 큰 문제가 없는 데이터 보관

코너케이스 (Corner Case) - 엣지케이스를 만족지만 외부변수나 특정 조건에서 문제가 발생하는 경우 (다 돌아가는데 윈도우 98은 지원이 안됨.. 등)

코드스니펫 (Code Snippet) - 코드조각, 재사용 가능한 소스코드를 가리키며 코드의 일부를 복붙할때 사용하기도 한다

콘솔 - 시스템을 물리적으로 조작할수 있는 체계 또는 입출력장치

컨텍스트 (Context) - 어떠한 행위를 할떄 필요한 정보

컨텍스트 스위칭 (Context switching) - 다수의 프로세스 실행 중 기존 프로세스를 중단하고 다른 프로세스를 교체하는것 으로 CPU에 실행할 프로세스를 교체하는 기술 (문맥교환이라고도 한다)

커널 (Kernel) - OS의 핵심이 되는 컴퓨터 프로그램으로 시스템의 모든것을 통제하며 각 응용프로그램 수행, 하드웨어 자원을 필요로하는 프로세스에 할당, 메모리제어, 시스템 콜을 수행하는 부분으로 항상 메모리에 상주하는부분

커널패닉 (kernel panic) - OS의 커널의 온전한 복구 및 계속 실행시 오류 발생의 여지가 있는경우 이를 방지하고자 나타내는 오류 (메모리 고갈로 시스템 핵심 기능이 실패하게 되는것, 블루스크린)

마이크로 커널 - 

캐시 (Cache) - 대용량 메인 메모리(RAM)과 중앙처리장치(CPU) 사이에 있는 데이터를 처리할떄 자주 사용하는 데이터를 보관하는곳 (자주 사용되는 데이터나 프로그램은 이 캐시에 저장해놓으며 중앙처리장치 명령시 캐시를 먼저 찾아보고(있으면 캐시히트) 없으면(캐시 미스) DRAM에서 데이터를 찾는다)

컴포넌트 (Component) - 재사용이 가능한 각각의 독립된 모듈로 여러 프로그램 함수를 모아 특정기능을 수행하도록 구성한 기능적인 단위 (여러 컴포넌트를 링크하여 실행가능한 단일파일(exe)로 만들수 있음

클래스로더 (Calss Loader) - 동적로딩에 필요한 클래스간 로딩 및 링크하여 런타임 데이터영역 (JVM메모리)에 올린다.

컴파일 (compile) - 코드 전체를 다른 언어로 바꿔주는 과정 -> 내가 작성한 "hello world"(고급언어)를 add  esp,12(어셈블리어) -> 010100010101(기계어)로 바꾸는것

컴파일러 (compiler) - 고급언어로 작성된 프로그램 전체를 목적프로그램을 생성해 실행가능한 프로그램을 생성(인터프리터보다 빠름 -> 코드를 전체를 한번에 읽기때문 //C언어, 자바 등)

코드를 한번에 번역하기에 배포시 구문오류가존재할수 없다, 기계어를 직접 만들어낸다, 수행성능이 좋다, 메모리관리는 직접해야한다.

크로스 사이트 스크립팅 (Cross-site scripting) - 웹 애플리케이션에서 나타나는 취약점으로 사이트 관리자가 아닌이가 웹페이지에 악성 스크립트를 삽입할수 있는 취약점이다 (

캡슐화 - OOP 특성중 하나로 외부로부터 데이터를 보호하기 위하여 직접접근을 막는것 (다른 객체에서 접근하여 값을 바뀐는걸 방지하기 위함 -> 접근제어자 기능)

콜백 (callback) - 멀티스레드의 작업완료 통보 방식중 하나로 작업처리를 요청 후 다른기능을 실행할수 있다 (작업 완료시 콜백메서드가 자동적으로 실행되기 때문)

터미널 (Terminal)  - 서버의 로컬 또는 원격으로 접속할 수 있는 콘솔(키보드, 마우스) SW로 구현한것으로 GUI에서 사용할수 있도록 하는 프로그램 (CMD)

트리 (Tree) - 나무가지처럼 노드로 이루어진 자료구조

트랩 (Trap) - 소프트웨어 인터럽트라고 말하며 프로그램(SW) 내부에서 발생하는 에러로 프로세스가 특정 시스템을 사용하려고 할떄 그 기능을 OS에 요청하는 방법 -> 프로세스 권한 밖의 일이니 인터럽트를 발생시켜 OS에게 해달라 요청

트랜잭션 (Transaction) - DB의 상태를 변화시키기 위하여 수행하는 작업의 최소단위 (주문하는 거래단위는 주문 -> 결제 -> 배송까지 주문완료이다. 전체 과정을 트랜잭션이라 칭한다)

템플릿 - 메서드 패턴 (Template Method Pattern) - 객체지향 디자인 패턴중 하나로 알고리즘 구조를 정의하고 일부 단계를 서브 클래스(자식클래스)에서 구현하도록 하는것 -> 기본적인 흐름은 추상클래스로 짜주되 필요한건 직접 구현하라고 하는것

필드 (field) - 객체 생성시 데이터가 저장되는곳 (변수와는 다르다!)

팩토리 메서드 패턴 (Factory Method Pattern) - 

포그라운드 작업 (foreground) - 사용자와 대화창구인 I/O장치를 통해 대화하듯 결과가 출력될때까지 기다리는 방식으로 처리하는 작업 (CMD에 명령어 입력시 결과가 출력되고 이것을 사용자가 보고 다음 명령어를 입력하는 (대화식) 작업)

프리픽스 (Prepix) - 연산자를 앞으로 배치하는 방식 {EX : (a+b)*c) -> * + a b c}

포스트픽스 (Postpix) - 연산자를 피연산자 뒤쪽에 표시하는 방법 ()

패킷 (Packet) - TCP/IP에서 사용되는 데이터의 단위로 인터넷상 네트워크 통신에선 호스트와 서로 패킷을 주고받는것 

포워딩 (Forwarding)- 데이터 패킷을 다른 장치로 전달하는 과정 (Port 포워딩, IP 포워딩)

패킹 (Packing) - 역설계를 막기위해 실행파일을 암호화 및 압축하는것으로 프로그램 용량을 줄이거나(Shrink) 검사 및 분석을 어렵게 하기위해서 사용된다.

패커 (Packer) - 실행파일을 변환하여 데이터를 저장하고, OS에서 호출하는 언패킹 스텁을 제공한다 -> 내부에 압축해제 코드를 퐇마하여 실행하는 순간 알아서 압축해제 및 실행되는 기술이다.

플레인텍스트 (plain text) - 그림, 그래픽이 아닌 문자열만을 대표하는 데이터

패키지 (package) - 클래스간 관리를 용이하게 하도록 관련된 클래스의 묶음을 의미하며 동일한 패키지에 속해있다면(동일한 C드라이브에 속해있다면) 사용가능하며 다른 패키지에 있는건 Import기능 사용 (패키지 경로 지정 - C:\User\Desktop를 package test.packgetest의 예시와 같이 참조할 클래스의 경로를 지정해주는것)

퍼널 (Punner) -  고객이 페이지를 탐색할때 접근하는 비율이 점차 작아지는데 이 모양이 깔대기와 같다하여 붙여진 이
프로토콜
(Protocal) - 컴퓨터 또는 전자기기 간 원활한 통신을 위해 지키기로 한 규약

프레임 (Frame) - 물리주소공간이 일정한 크기로 균일하게 나뉜것 TCP, IP, HTTP, SMTP, FTP, DHCP 등이 있다.

프레임워크 - 개발에 필요한 기본적인 기능이 내장된 제작키트

페이지 (Page) - 논리주소공간이 일정한 크기로 균일하게 나뉜것

프로세서 (Processor) - 중앙처리장치(CPU)를 의미하여 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛 (HW)

프로세스 (Process) - 컴퓨터 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업단위로 프로세서가 실행할 명령어와 데이터 목록을 메모리에 읽어들인것 (프로세스간 자원 공유는 불가하며 만일 공유할경우 커널패닉 발생, 텍스트(실행코드)섹션, 데이터(전역변수)섹션, 힙(동적 할당 메모리)섹션, 스택섹션)

포인터 (point) * - 위치를 표현하는 것으로 그릇위에 사과가 있을때 누군가 그릇에 있는걸 가져오라고 하면 그릇은 사과를 가리키는 포인터가 되는것이다

펌웨어 (Firmware) - 특정 HW(주로 ROM)에 포함된 SW로 전자기기의 기본적인 제어 및 구동을 담당

(heap) - 객체와 배열이 생성되는 영역으로 여기서 생성된 객체 및 배열은 JVM 스택 영역의 변수 및 다른객체의 필드를 참조한다 (참조하는 영역이 없으면 JVM 에선 Garbage로 판단, GC가 가동되어 삭제된다)

(EX : String a = "야근왕" 에서 야근왕은 힙영역에 저장된다)

함수 (Fuction) - 어떠한 기능을 위하여 만들어진 기능 (독립적으로 존재하는게 함수이냐, 클래스 내부에 종속된게

메서드)

회수 (Retrieval) - 데이터 관련 모음으로 일정 시간대를 사용해 데이터를 가져오는 방식 (일정 기간의 문서, 파일등을 회수)

헤더 (Header) - 

활성화 레코드 (Activation record) - 메인함수 호출시 생성되고 스택에 저장되며 컨텍스트 스위칭 이전에 함수상태를 기록,복원을 위한것이다 (리턴값, 값 파라미터, 지역변수 등을 기록하며 스택 프레임(Stack Frame)이라고도 한다)

해시 (Hash) - 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한것 (A -> 4tew43 / BFDS -> 64sfds)

해시함수 (Hash Function) - 데이터를 입력받아 데이터에 산술연산을 수행하여 한개의 수를 반환

횡단관심사 (cross-concern) - 핵심적인 기능이 아닌 중간중간에 삽입되야할 기능을 의미한다

기타, 영어

` (숫자 키패드 1번 옆에것) - 백틱

ABI (applictaion binary interface) - 응용 프로그램 이진 인터페이스로 특정 아키텍처에서 2개 이상의 SW간 하위수준 이진 인터페이스를 정의

final - 값을 고정하는 것으로 한번 선언한경우 프로그램 도중 수정이 불가능하다. (클래스 - 상속불가 ,필드 - 수정불가 ,메소드 - 오버라이딩 불가 모든곳에 사용가능)

RAM (Random Access Memory) - 임의 접근(Random Access)이 가능한 메모리로 어떤 위치에 있든 즉시 이동해 값을 읽을수 있는 메모리로 빠르지만 값이 비싸다 (DRAM,SRAM으로 나뉜다)

DRAM (Dyanmic RAM, 동적 메모리) - 전원이 계속 공급되더라도 주기적으로 재충전 되어야 기억된 내용을 유지할수 있다.

XMX (Memory Maximum) - JVM이 사용 가능한 힙 메모리의 최대크기, 클수록 GC의 빈도가 줄어드나 GC에 드는 시간이 오래걸린다.

XMS (Memory Start) - JVM의 Heap의 크기 제어를 설정, 작을수록 GC가 자주 일어나며 너무 작으면 OOM이 발생한다. (기본값 : 50MB)

Dispatcher (디스패처)- 요청, 작업, 이벤트 등을 적절한 처리기나 서비스로 전달하는 역할

  • OS - CPU 스케줄러의 일부로 준비상태의 프로세스중 1개를 선택, CPU실행을 위해 그 프로세스를 준비하는 역할(컨텍스트 스위칭)
  • 웹 - HTTP 요청을 받아 그 요청을 URL, 메서드 같은 정보를 분석해 해당 요청을 처리할 컨트롤러, 뷰로 라우팅하는역할 (디스패처서블렛 스프링에서 중앙 허브같은 역할로 - 요청매핑, 핸들러실행, 모델 및 뷰 선택, 예외처리, 뷰 렌더링)
  •  

CPU Schediling (CPU 스케쥴링) - CPU가 유후 상태가 될때마다 OS는 준비 큐에 존재하는 프로세스중 한개를 선택해 실행해야하며 이것은 스케줄러에 의해 실행된다.

UEFI (Unified Extensible Firmware Interface) - 시스템 부팅, 운영체제 로드에 사용되는 S/W 인터페이스  (BIOS 대체목적)

REMEMBER_ME : 스프링 시큐리티에서 세션종료 및 브라우저가 꺼져도 사용자를 기억하고 자동로그인을 제공하는것 (통상적으로 쿠키를 사용)

SPA (single-page application) - 단일 페이지 애플리케이션으로 현재 페이지를 동적으로 작성함과 동시에 사용자와 소통하는 웹 애플리케이션

EAR (Enterprise Archive) - 하나 이상의 모듈들을 하나의 아카이브로 묶어 여러 모듈이 애플리케이션 서버에 동시에 배치되도록하는 파일 (Gradle, maven 등)

Deploy - 배포

CDN (Content Delivery Network) - 서버에서 사용자가 요청하는 콘텐츠를 캐싱해두고 가까운 위치에서 콘텐츠를 제공하는 역할

NAT - IP 헤더에 있는 네트워크 주소 정보를 수정하여 다른 주소로 매핑하는 기술

Tenant -

LoopBack - 로컬 호스트 주소라고도 이야기하며 자신에게 데이터를 전송하고 다시 받는 과정 즉, A의 네트워크 계층이 B의 네트워크 계층으로 패킷을 전송하는게 통상적인데 목적지 주소를 LoopBack으로 한채 패킷을 보낼경우 A네트워크 계층의 상위로 값을 올려보낸다(IPv4의경우 127.0.0.1 /// IPv6의 경우 ::1)

3th party cookie (서드파티쿠키) - 웹사이트를 방문할떄 해당 사이트가 아닌 다른 도메인에 생성되고 저장되는 쿠키로 A사에 접속했는데도 B사가 해당 쿠키(데이터)를 수집할수있다. 

SMTP (Simple Mail Transfer Protocol) - 이메일 메세지를 주고받는데 사용되는 통신프로토콜

SEO (Search engine optimization) - 검색 엔진 최적화로 각 웹사이트나 웹페이지에 대한 트래픽의 품질과 양을 개선하는 과정이다.

Thread - 다른 스레드와 독립적으로 실행될수있는 프로그램내의 일련의 명령 -> (멀티스레드) 

DeadRock - 교착상태란 의미로 스레드에선 상호간 리소스가 해제되기만 기다리고 있는 상황 (이도 저도 못하는상황)

AJAX (Asynchronous Javascript And Xml) - 자바스크립트를 통해서 서버에 데이터를 비동기 방식으로 요청하는것

JDBC API - 순수 자바코드를 통한 DB 접근

Entry Point - 프로그램 시작점 (java의 psvm)

SSO (Single Sign-On) - 한번의 로그인으로 다른 사이트에서 자동적으로 접속하여 이용하는것 (A에 카톡 로그인시 B도 로그인됨)

RSS (Rich Site Summary) - 새로운 콘텐츠가 올라왔을때 해당 사이트에 방문하지 않고 리더 한곳에서 그 콘텐츠를 이용하기 위한 방법 (XML 기반 문서형식으로 이뤄져있다)

SpringJdbcTemplate - JDBC API에 템플릿 메서드 패턴을 적용해 커넥션을 얻어 DB 접근 (SQL코드 작성 필요)

MyBatis - SQL 매퍼라고 불리며 프로그램 코드와 SQL코드를 분리할수 있다. (XML에 SQL코드 작성)

JPQL - 엔티티를 통해 DB에 접근이 가능하며 SQL과 유사한 코드로 테이블 중심이 아닌 엔티티 중심 개발이 가능하다.

JPA Criteria (jpa)- 테이블이 아닌 엔티티를 통해 DB접근이 가능하며 JPQL로 해결이 힘든 동적 쿼리 문제를 자바 코드로 해결한다(표준이지만 다루긴 어렵다)

QueryDSL - 오픈소스 라이브러리로 JQPL로 해결이 힘든 동적 쿼리 문제를 자바코드를 통해 실용적으로 해결한다 (실무에 자주 쓰인다)

WAR (Web Application Archive) - 웹 어플리케이션을 압축해 저장해 놓은 파일로 배포에 사용하는 파일 

SDK (Software Development Kit) - SW개발에 사용되는 키트로 JDK도 SDK의 일종이다

STW (Stop The World) - GC가 가동되는 시점에서 모든 작업은 중지되는데 이것을 가리킴

RTE (Run Time Enviorment) - 런타임 환경

Iaas - 클라우드를 이용해 서버용 인프라(가상화된 서버)가 갖춰진 컴퓨터를 대여하는 서비스 (EC2, MS, IBM)

Pass - 애플리케이션 개발, 서비스에 필요한 서버,OS, 개발환경을 자동으로 설치, 제공된 플랫폼을 제공하는 서비스

SaaS - SW가 완성된 형태로 제공하는 클라우드 서비스 - N드라이브, MS오피스

HTTP (Hypertext Transfer Protocol) - 클라이언트, 서버간 통신을 위한 프로토콜(규약)으로 Stateless하는 특징을 갖는다

HTTPS (Hypertext Transfer Protocol Secure) - CA라는 인증기관에서 인증서를받고 인증서가 유효한지 검증 - 구글에서 http - > https로 변경을 진행하며 SEO를 함께 진행하였다

TLD (Top Level Domain) - 최상위 도메인

ELF (Executable and Linkable Format) - 실행파일, 목적파일, 공유 라이브러리, 코어덤프를 위한 x86기반 유닉스 표준 바이너리 파일형식

규칙 기반 옵티마이저(Rule-Based Optimizer, RBO) - 미리 정의된 규칙 집합을 사용하여 실행 계획을 선택하는방식으로 일반적으로 쿼리의 성능이 높아진다. -> 인덱스가 있는 칼럼을 우선사용, 가장 적은수의 행(pk같이 1개만 나오는것)을 반환하는 조건을 먼저적

비용 기반 옵티마이저(Cost-Based Optimizer, CBO) - 실행 경로의 비용을 추정하고, 가장 낮은 예상 비용을 가진 경로를 사용하는 방식 -> 인덱스를 먼저 확인하여 가장 낮은 총 비용을 가진 계획을 선

Reverse Proxy - 웹 서버보다 앞에 위치하여 클라이언트 요청을 웹서버에 전달하는 유

ClickJacking - Frame등 환경에서 유저 상호작용을 유도해 사용자가 인지하지 못하는 상태에서 악의적인 기능을 수행토록 하는기법 (재생 버튼에 프로그램 다운링크 + 재생기능 2가지를 넣는다던가)

X-Frame-Options - 홈페이지를 프레임별로 개발할경우 각 프레임별 접근 URL이 다른데 이를 방지하기 위해  사용 -> 로드를 반복하여 한번에 수십, 수백 리퀘스트를 발생시킬 여지가 있기때문

Iframe - html태그의 일종으로 한 웹페이지 내부에 다른 html 문서를 내장하도록 하는 요소

Proxy - 클라이언트 시스템 그룹 앞에 위치하여 컴퓨터가 웹사이트 및 서비스에 요청할경우 해당 서버가 이 요청을 가로채 해당 클라이언트를 대신하여 웹서버와 통신한다.

LTS (Long Term Support) - 장기지원버전 - 한가지 예시로 ogg파일은 동영상파일인데 HTML5에선 작동되지 않는다

SRAM (Static RAM, 정적 메모리) - 전원이 공급되는동안 기록된 내용이 지워지지 않는다 (전원이 꺼지면 날라감)

ROM (Read Only Memory) - 전원이 꺼져도 정보를 저장할수 있는 메모리

InnoDB - Mysql에서 사용되며 트랜잭션, 데이터 무결성 등 제공 (.ibd 확장자)

MyISAM - Mysql DB시스템에서 사용되는 엔진 (5.5부터 innoDB로 변경)

PWA (Progressive Web Apps) - 브라우저 기능을 활용해 네이티브 앱 같은 다양한 편의를 제공하는 웹앱

IDE - 통합개발환경 (개발툴 - 이클립스, VS..)

TDD (Test-Driven- development) - 테스트 주도 개발로 설계 이후 콬드개발 및 테스트 케이스를 작성하는것

BIG O (빅오) - 알고리즘중 최악의 실행 시간을 표기한다.

Big-Ω(빅 오메가) - 알고리즘 최상의 실행시간을 표기

Big-θ(빅 세타) - 알고리즘 평균 실행시간을 표기

CORS (Cross-Origin Resource Sharing) - 동일하지 않은 출처에 대해서도 리소스 접근을 허용하는 정책으로 SOP 정책을 조금 완화 

Pseudo-Code (슈도코드) - 가짜 코드로 실행될 내용을 인간의 언어로 간략히 설명해놓은것 (주석)

Dictionary (딕셔너리) - 연관배열을 뜻하며 리스트, 튜플처럼 순차적인 값이 아닌 KEY에 해당하는 Vlaue를 얻는다

XML (Extensible Markup Language) - 공유 가능한 데이터 정의 및 저장으로 타 플랫폼(시스템)간 DATA교환이 목적 - SQL과 같은 프로그램에서 데이터를 가져와 다른 프로그램,플랫폼과 공유 가능

HTML (Hypertext Makup Language) - 정적 웹페이지 작성에 사용

Patch version - 패치 버전으로 버그 및 소규모 개선시 사용(1.25.432 에서 432)

Minor mare - 부 버전으로 이전 버전과 호환되는 새로운 기능 및 개선사항이 있을경우 사용(1.25.432 에서 25)

Major vesion - 주요 버전으로 큰 규모의 변경사항, 호환되지 않는 변경사항이 있을경우 사용(1.25.432 에서 1)

Semantic Tag (시멘틱 태그) - 웹페이지 구조를 쉽게 이해할수 있도록 정의된 태그 (<nav>, <header>, <section>..)

XSS (Cross-site scripting) - 웹페이지에 악성 스크립트를 삽입할수 있는 취약점으로 주로 게시판에 악성스크립트가 담긴 글을 남기는 형태로 지속형, 비지속형 2가지 종류가 있다.

Queue (큐) - 메세지 또는 트렌젝션에서 주로 사용되며 순서를 보장할 필요가 있을경우 사용됨 (FIFO방식)

Deque (데크) - 양방향큐로 앞뒤 양쪽에서 값을 추가, 제거가 가능하다

Dequeue(디큐) - Enqueue의 반대로 큐에서 값을 빼는(내보내는)것으로 Front는 고정, 뒤에서 데이터를 앞으로 이동시킴

Enqueue(인큐) - Dequeue의 반대로 큐에서 값을 넣는(삽입하는)것으로 Front는 고정, 데이터가 뒤로 계속 쌓임 

POP - 스택에 데이터를 빼는것

PUSH - 스택에 데이터를 넣는것

OOP (OOriented Programming) - 객체지향프로그래밍 (캡슐화, 추상화, 다형성, 상속 4가지 특징)

POJO - 오래된 방식의 자바 오브젝트

AOP (Aspect Oriented Programming) - 관점지향프로그래밍

OM (Out of memory) - 메모리 초과

Aspect - 횡단 관심사를 모듈화한것으로 advice + pointcut를 합친개념

AspectJ - 자바 AOP 소프트웨어의 표준

DLL (Dynamic-link Library) - 동적 링크 라이브러리 (윈도우에서 동적링킹할때 사용되는 라이브러리 파일)

AWT (Abstract Window Toolkit) - GUI 프로그래밍(윈도우 프로그래밍)을 위한 도구 (컴퓨터 기본 화면 및 아이콘 등) OS의 컴포넌트를 그대로 사용(OS 종속적)

XML (eXtensible Markup Language) - W3C에서 여러 특수 목적의 마크업 언어를 만드는 용도에서 권장되는 다목적 마크 업 언어 (HTML도 XML의 일종이다)

BSS (Block Started by Symbol) - 초기화되지 않은 전역 데이터를 위한 영역으로 데이터 세그먼트 또는 일부 컴파일러,링커가 사용

rt - 런타임 파일

Stable Version - 최종 버전에서 테스트가 완료되고 버그가 수정된 안정된 버전 (실제 유저에게 배포하는 버전 - 진짜 최종)

Legacy Version - 사용은 가능한 예전 버전에서 테스트 및 버그가 수정된 안정된 버전 (문제는 없으나 진짜 최종은 아님)

Major Version - 기존 API의 변경, 삭제가 이뤄져 업데이트 안하면 동작이 안됨(4.2.05에서 4가 메이저 버전)Minor Version - 이전 버전과 호환되는 방식으로 API가 추가되었으니 살펴보라는 의미 (4.2.05에서 2가 마이너 버전)

Patch Version - 이전 버전과 호환되는 버그 수정을 했을경우 (4.2.05에서 05는 패치버전)

Nightmare Version - 문제가 많은 버전 (주로 알파테스트에 사용됨)

JAR (Java Arcive) - 자바 클래스 파일 묶음(java의 배포파일)

Lib - 라이브러리

CSRF (Cross-Site Request Forgery) -  이미 인증된 사용자의 권한을 이용하여 공격자가 의도한 행동(예: 패스워드 변경, 이메일 주소 변경 등)을 웹 애플리케이션에 요청하는 방식 (사용자 로그인 -> 악성 코드 실행 사이트 접속 -> 해커가 이미 인증된 계정 정보를 가지고 개인정보 조작, 변경)

API (Application Programmin interface) - 두 SW의 구성요소가 서로 통신할수 있도록 돕는 매커니즘(방법)

UTF (Unicode Transformation Format) - 유니코드를 인코딩 하는 방법으로 2,8,16등 여러가지 방법이 있으며 숫자를 기준으로 인코딩 한다는 의미이다. (UTF16은 16비트, 1바이트를 기준으로 인코딩하며 가장 보편적으로 쓰인다.)

IPC (Inter-Process Communication) - 프로세스간 통신으로 데이터를 주고받는 행위 또는 이에대한 경로를 의미 (공유메모리, 메세지전달 2가지 방식)

SOLID - 객체지향 5대원칙으로 SRP, OCP, LSP, ISP, DIP 앞글자를 따서 SOLID 원칙으로 불리운다

JDK (Java Development Kit) - 자바 프로그래밍시 필요한 컴파일러등의 개발도구가 내장됨

JRE (Java Runtime Environment) - 바이트 코드로된 컴파일된 자바 프로그램을 실행할때 사용 (JVM이 자바 프로그램을 실행할때 필요한 라이브러리 파일 및 기타파일이 내장됨)

DHCP (Dynamic Host Configuration Protocol) - 호스트의 IP주소와 각종 TCP/IP프로토콜의 기본 설정을 클라이언트에 자동적으로 제공해주는 프로토콜

TCP (Transmission Control Protocol) - 한 기기에서 다른 기기로 데이터 전송하는것을 담당 (JAVA가 제공하는 java.net패키지의 tcp소켓 존재) 

UDP (User Datagram Protocol) - JAVA의 경우 datagramSocket과 DatagramPacket클래스를 사용해 구현 (빠른 전송을 위해 오버헤드가 적으나 데이터순서, 무결성 미보장)

IP (Internet Protocol) - 인터넷에서 데이터 주소를 지정하고 라우팅 하기 위한 요구사항의 집합으로 

패킷 헤더부분에 나온 IP주소를 기반으로 승인자 호스트에서 요청자 호스트로 패킷을 전달하는 작업을 수행하며 이 데이터를 캡슐화하는 패킷구조를 의미하며 소스 및 요청자에게 데이터그램 레이블 지정에 사용되는 주소지정방법

TCP/IP (Transmission Control Protocol / Internet Protocol ) - 통신 규칙의 모음으로 프로토콜 스위트라고도 불리운다(4계층이 있다)

AMP (Accelerated Mobile pages) - 가속화된 모바일 페이지

FTP (File Transfer Protocl) - 파일 전송 프로토콜

NFS (Network File System) - 네트워크 상에서 파일(디렉토리)을 공유하여 어디서든 사용 가능하도록 설계된 파일시스템

.s - 컴파일러가 출력한 어셈블리어 코드

.S - 개발자가 직접 작성한 어셈블리어 코드

MIME (Multipurpose Internet Mail Extensions) - 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 매커니즘

AMQP (Advanced Message Queuing Protocol) - 어드밴스트 메시지 큐잉 프로토콜

 

 


메모장
MSA 아키텍쳐 - 각각 마이크로하게 나눈 독립적인 서비스를 연결한 구조

UTF8MB4

IOC (Inversion of Control) - 제어의 역전

unix time -> timestamp

timestamp <-> datetime 

BULK

SQL 세퍼레이터

I18N

HFO 

N-gram

DBaas

XHTML - 

DB Partitioning - 

메모리 안전 언어 (memory-safe languages) - 

 

'CS' 카테고리의 다른 글

HTTPS VS HTTP  (0) 2024.09.17
JS파일 가져오기 로컬, 원격 차이  (0) 2024.08.03
크로스 도메인,SOP, CORS, XSS,  (0) 2024.01.25
IP, DNS, HTTP  (0) 2023.07.09
HTTP 헤더  (0) 2023.05.06

코드 리팩토링을 진행하던중 외부 라이브러리를 가져올때 차이가 궁금해졌다.

//로컬
<script src="/JS/sockjs.min.js"></script>
//원격
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.5.2/dist/sockjs.min.js"></script>

성능비교 

로컬에 위치한 파일을 사용할경우 크기는 57.8KB가 나왔으며 통상적인 통신시간은 10~20ms였다.

원격의 경우 (CDN 방식)

크기는 20.7KB가 나왔으며 시간은 통상적으로 20~30ms가 소요되었다.

 

해당 결과를 바탕으로 결론을 내려고 했으나 다른 글에선 CDN이 더 빠르다는 소리가 있었다..

그렇다면 어떤게 더 나은 방식일까?


브라우저 렌더링 과정

  1. 리소스 요청 및 응답: 브라우저가 웹 서버에 HTML, CSS, JavaScript, 이미지 등 필요한 리소스를 요청, 응답을 받습니다. 개발자 도구의 '네트워크' 탭에서 확인 가능
  2. DOM, CSSOM 생성: 브라우저 렌더링 엔진은 전달받은 HTML을 파싱해서 DOM (Document Object Model) 트리를 생성, CSS 내용을 파싱하여 CSSOM (CSS Object Model) 트리를 생성(DOM과 CSSOM은 각각 웹 페이지의 구조와 스타일 정보)
  3. 렌더 트리 생성: DOM과 CSSOM을 결합하여 렌더 트리를 생성합니다. 렌더 트리는 실제로 화면에 표시되는 요소만을 포함하며, 각 요소의 시각적 속성(크기, 색상 등)을 담고 있습니다.
  4. JavaScript 실행: JavaScript 코드를 파싱하여 AST (Abstract Syntax Tree)를 생성되고, 이는 바이트 코드로 변환되어 실행된다. 여기서 JavaScript는 DOM을 조작할 수 있으며, 이 과정에서 DOM 또는 CSSOM이 변경될 수 있습니다, (documnet.getElementByid등..)
  5. 레이아웃 계산: 렌더 트리를 기반으로 각 요소의 위치와 크기를 계산하는 레이아웃 과정을 진행(리플로우)
  6. 페인팅: 마지막으로 모든 레이아웃이 계산된 요소들을 화면에 출력 (텍스트 색상, 배경 이미지 등이 화면에 렌더링)

 

DOM-Tree의 예시 사진이며, 노란색이 CSSOM이다

 

여기서 2번쨰 DOM, CSSOM 생성 시점에서 JS파일이 실행 및 로드가 진행되며 페이지 로딩이 끝난뒤 button 등으로 JS를 실행할경우 4~6의 과정을 반복한다.

또한 html파싱을 중단하고 진행하는지 아닌지에 따라 async(비동기)과 defer(동기) 2가지 속성에 따라 나뉜다.

더 자세한건 프론트 페이지를 참조하자!..

 

이제 본론으로 돌아와서 원격에서 가져오는 CDN의 의미부터 알아보겠다.


CDN(Content Delivery Networks)

 

분산서버 시스템을 의미하며 콘텐츠를 요청하는 사용자에게 더 가깝게 캐싱하여 대기시간을 줄이는것이 주요 목적이다.

CDN은 여러 위치에 있는 Edge를 통해 사용자가 콘텐츠를 요청할경우 요청자와 가장 근접한 Edge로부터 캐시 복사본을 제공하여 콘텐츠 전달에 사용되는 시간을 줄이는것이 주요 목적이다.

쉽게 말해서 감자를 구매하기 위해 감자농장을 찾아가는게 아닌 집앞 슈퍼마켓에 가는것과 동일한 이유이다.

가장 자주볼수 있는 CDN은 Cloudflare으로 서울에 있다고한다! (https://www.cloudflare.com/ko-kr/network/)

CDN의 경우 캐싱을 진행하지 않는다.

First off, modern browsers don't cache requests to CDNs across multiple domains,

최근 브라우저는 CDN을 캐싱하지 않는다고 하며 만약 CDN을 캐싱할경우 이를 토대로 추적이 진행될 우려로 인해 이미 다운로드한 LIB를 포함하더라도 다시 다운로드를 진행하게된다.

설명이 조금 모호했는데 더 자세히 말하자면 브라우저가 10분에 A사이트에 접속하다가 15분에 B사이트에 접속할경우 A사이트에서 CDN이 동일한 스크립트가 존재하더라도 B사이트에 접속할때 다시 다운받는다는 소리이다. (A는 10분에 받는게 B는 15분에 받은게 존재한다)

2번 다운로드 받는게 보안측면에서 더 문제가 있지만 캐시 타이밍 공격을 통해 방문한 웹사이트를 못알도록 하는 이유이다.

캐시 타이밍 공격 - 사용자의 방문한 웹사이틑 비롯한 브라우저의 활동내역을 알아내는것(특정 사이트에 접속했을경우 리소스가 다운되었으며 캐싱이 되어있기에 다시 접속할경우 network부분에선 빠른 load결과가 나타날것이고 이를 통해 해당 페이지에 접속을 했다는걸 알수있다)

원본 링크 : https://blog.wesleyac.com/posts/why-not-javascript-cdn

 

 

즉, 현재 내 상황은 서버도 Local, 실행도 Local이기에 CDN보다 local에서 Script를 가져오는데 더 빠른속도로 나온것이며 실제 배포를 진행한경우 CDN을 이용하는게 더욱 빠르다는 소리이다.


관련 레퍼런스

링크1(스택오버플로우) : https://stackoverflow.com/questions/42591235/is-it-better-to-use-cdn-for-js-and-similar-resources-vs-local

링크2 : https://www.cdnetworks.com/web-performance-blog/cdn-vs-local/

 

'CS' 카테고리의 다른 글

HTTPS VS HTTP  (0) 2024.09.17
코딩 용어모음  (0) 2024.08.23
크로스 도메인,SOP, CORS, XSS,  (0) 2024.01.25
IP, DNS, HTTP  (0) 2023.07.09
HTTP 헤더  (0) 2023.05.06

크로스 도메인 (Cross Domain) - 서로 다른 도메인간 호출로 주로 AJAX를 활용해 타 사이트의 데이터를 크롤링해올때 데이터의 도용 및 각종 보안문제를 야기하는데 이를 막기위해 Cross-Origin HTTP요청을 제한하는 것이다

 

동일출처정책 (SOP, Same Origin Policy)

  • 상단의 크로스 도메인으로 인하여 코드 탈취 및 악용의 여지를 없애기 위해 만들어진 정책으로 동일한 출처의 접속만 리소스에 접근하도록 제한하는것
  • SOP가 적용되지 않을경우 사용자는 A사이트에 로그인후 인증토큰을 받고 이것이 유효한 상태로 B사이트에 방문할경우 B 사이트의 스크립트는 사용자 브라우저를 통해 A 사이트인증토큰에 접근이 가능하게된다. A사이트의 토큰을 B사이트에서 악용할수 있다는 점이다.
  • http://example.com:80 http://example.com:8080 는 포트번호가 다른데 SOP에 따라 서로 다른 출처로 간주된다
  • AJAX를 통한 크롤링이 늘어나면서 SOP를 따질경우 제약이 너무 많아지기에 CORS정책이 나오게 되었다. 
  • 개발자도구 - network 탭에서 Access-Control-Allow-Origin란 헤더가 없을경우 다음과 같은 에러가 나타나게된다.
//크로스도메인 에러
XMLHttpRequest cannot load http://www.abc.co.kr.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://cvb.abc.co.kr' is therefore not allowed access.

 

프로토콜 - 연결,통신 데이터 전송을 제어하는 일련의 규칙 및 표준 (http, https...)

스킴 (Scheme)- URL체계 최상위 레벨로 특정 프로토콜의 이름

  • http: 일반적인 웹 페이지에 접근하기 위한 HTTP 프로토콜.
  • https: 보안 웹 페이지에 접근하기 위한 HTTP Secure 프로토콜.
  • ftp: 파일 전송 프로토콜(FTP)을 사용하여 파일을 전송하거나 다운로드할 때 사용.
  • mailto: 이메일 주소를 지정하고 이메일 클라이언트를 열 때 사용.

크로스 도메인 이슈 (CORS, Cross Origin Resource Sharing)

  • HTTP헤더 기반 매커니즘으로 동일 출처 이외의 다른출처도 접근할수 있도록 하는 기능 -> 다른 사이트의 코드를 허가없이 도용하는걸 방지하기 위함
  • 만일 CORS정책을 지키지 않은상태로 다른 출처가 리소스의 로드를 요청할경우 SOP에 의해 거부, 리소스가 차단
  • 서버가 실제 요청을 허용하는지 확인을 위해 브라우저가 원본간 리소스를 호스팅하는 서버에 "실행전" 요청 매커니즘에 의존한다.
  • 브라우저에서 두번쨰 요청 도메인이 처음 요청을 받고 응답한 사이트의 도메인에 포함된 URL이 아닐경우 에러
  • Simple request, Pre-flighted request 2종류로 나뉜다.

 

Simple request (간단한 요청)

pre-flighted 없이 GET,HAED,POST중 1가지 방식이며 POST는 content-type이 하단과 같은경우에만 허용된다.

  • application/x-www-form-unlencoded, 
  • multipart/form-data
  • text/plain
  • 클라이언트가 요청을 보낼경우 브라우저는 CORS에 대한 헤더를 추가하여 서버에 전달 -> 서버가 헤더 확인후 Origin(출처)값이 허용된다면 요청 헤더의 Access-Control-Allow-Origin를 Origin 값으로 설정한뒤 브라우저에 보낸다 -> 브라우저는 Access-Control-Allow-Origin가 탭의 출처와 일치하는지 확인한다 (와일드카드도 적용된다) 

Preflighted Request (사전 요청)

복잡한 요청을 보내기전 브라우저가 OPTIONS 메서드를 사용하여 서버가 해당 요청을 수용할 수 있는지 확인하는 것입니다.

  • 요청을 보낸다 -> 서버는 Access-Control-Allow-Origing헤더를 참고하여 SOP를 검증 -> 브라우저는 CORS 요청을 보낸다 -> 해당 요청이 허용된경우 실제 요청 처리
  • JSON방식으로 데이터를 가져올떈 SOP에 영향을 받지만 JS, CSS파일은 SOP에 영향을 받지 않으므로 JS파일 내부에서 JSON형식으로 파싱해 사용가능
  • 클라이언트는 브라우저 실행옵션, 플러그인을 활용해 CORS 회피(무시) -> 브라우저가 진행하는것이기에 문제없다

 

사이트간 스크립팅 (XSS, Cross-site scripting)

웹사이트의 관리자 이외의 사람이 웹페이지에 악성 스크립트를 삽입할수 있는 취약점으로 주로 게시판에 악성스크립트가 담긴 글을 올리는 형태이다. (웹페이지 일부를 다른 사이트로 링크 및 악성코드를 심어 피싱사이트로 유도)

 

비지속적 XSS (Non-persistent) - 클라이언트가 제공하는 HTTP쿼리 매개변수에 적절치 않은 결과를 페이지에 출력하는것 (반사형 XSS라고도 한다.)

  • 검증되지 않은 사용자가 URL파라미터, HTTP요청 헤더정보를 수정해 공격하는것으로 주로 사용되는건 검색엔진의 검색창이다
  • 검색엔진의 검색창에서 문자열을 검색하는경우 이것은 결과페이지(url)에 나타나게 되는데 
  • 주로 피해자에게 입력받은 검색어를 표시하는곳, 입력한 값을 오류메세지와 같이 보여주는곳에 스크립트를 삽입하며 이때 입력값을 포함해 응답을 전송할때 실행한다. (피해자가 직접 스크립트를 실행하도록 유도하기에 1회성 공격이라 할수있다)
  •  

 

 지속적 XSS (persistent XXS) - 공격자(A)가 기존 페이지에 악성코드를 삽입, 서버의 DB에 저장되는데 이것이 다른 사용자(B,C,D,..)에게 정상적인 페이지처럼 계속 출력되는것

  • 악성 스크립트 삽입 -> 서버에 저장 -> 다른 사용자에게 전달 -> 실행 및 영향
  • 다른 사용자는 이것이 출처가 분명한 사이트에서 받아왔기에 문제가 없다고 생각하지만 실질적으론 (A)의 악성코드도 같이 가져오는 것이며 쿠키를 탈취당하거나 타 사이트로 리다이렉션되는 방식이다. 

 

참고링크 : https://coding-maggot.tistory.com/100

'CS' 카테고리의 다른 글

코딩 용어모음  (0) 2024.08.23
JS파일 가져오기 로컬, 원격 차이  (0) 2024.08.03
IP, DNS, HTTP  (0) 2023.07.09
HTTP 헤더  (0) 2023.05.06
난독화  (0) 2023.05.03

IP(Internet Protocol)

가상의 인터넷 환경에서 메세지를 주고받기 위해선 상호간의 위치를 지정할수 있는 주소가 필요한데 이를 IP주소라고 칭한다.

초기의 인터넷 환경이 작았을땐 다이렉트로 연결하면 무방했지만 점차 웹은 더 넓은 영역을 갖게되었고 이를 보완하고자 나타난것이 IP 프로토콜이다.

IP는 지정한 주소에 데이터를 전달 및 패킷이란 단위로 데이터를 전달한다.(출발 및 목적지 IP, 기타 정보로 통상적으로 1500byte로 전달)



IP프로토콜의 한계

1. 비연결성(Connectionless)

  • 클라이언트와 서버가 한번 연결을 맺은후 서버가 응답을 마치면 연결을 끊는것(쉽게 말해 줄서있던사람이 용건이 끝나면 보내되 추가적인 용건이 생긴다면 줄 맨뒤로 보내버리는것) -> 그때마다 핸드쉐이킹을 진행해야 하기에 오버헤드가 발생할 여지가 있다.
  • 만일 연결을 유지할경우 서버는 이를 위해 지속적인 자원을 할애해야하며 이는 곧 서버의 효율저하를 초래한다. (서버 자원의 효율화)
  • 오버헤드를 줄이기 위해서 HTTP의 KeepAlive속성을 사용할수 있다 (일정 시간동안 서버-클라이언트간 패킷 교환이 없을경우 상대방에게 패킷을 주기적으로 보내며 이에 대한 응답이 없을경우 연결을 끊어버리는것 )
  • 요청을 받을경우 상대의 상태가 어떻든(꺼져있거나 주소가 다르거나 하여도) 일단 보내고 연결을 끊어버리기에 의도한 순서나 결과에 맞지 않는 결과가 출력된다.

2. 비신뢰성

  • 중간에 패킷이 사라지거나(패킷소실), 패킷의 순서가 다를경우(1500Byte가 초과될경우 패킷을 분할하여 보내나 모두가 동일한 경로로 가지 않기 때문에 순서가 다르게 도착할 우려가있다.)

3. 프로그램 구분 불가능

  • 동일한 IP를 사용하는 서버에서 통신하는 애플리케이션이 2개 이상일경우 어떤 애플리케이션으로 전달해야할지 구분이 어렵다 

이러한 문제는 후술할 TCP/UDP를 통하여 해결하였다.

 

오버헤드 -  어떤 처리를 하기위해 들어가는 간접적인 처리시간


TCP/UDP

Transmission Control Protocol (TCP) - 전송 제어 프로토콜

  • 데이터를 보내는데 연결이 필요하다. ->핸드쉐이크를 통한 목적지 상태를 점검 (IP프로토콜 3번)
  • 자료가 스트림 형태로 전송되며 타 컴퓨터에서 수신되어 링크가 생성되는 연결기반이다. 
  • 3way-hanshake를 통한 작업이 많기에 신뢰성, 연결성이 보장되나 속도가 떨어진다 (실질적인 데이터 전송이 이뤄지기전 진행하는 과정으로 목적지의 상태가 멀쩡한지 확인하는 과정이 추가된다. -> IP프로토콜 1번 해결)
  • 데이터 전달 보증 - 패킷소실이 일어나도 클라이언트가 해당 사실을 인지할수 있도록 알려준다(Sequence number 참조) -> IP프로토콜 2번 해결
  • 가상회선 방식 - 데이터 전송전 논리적인 연결이 설정되는데 각 패킷마다 가상회선 식별번호(VCI, Virtual Circuit Identifier)가 포함되어 모든 패킷이 전송되면 가상회선이 사라지고 패킷들은 전송된 순서대로 도착한다. (하단의 Acknowledgment Number 참조)
  • 서버에서 내부적으로 최적화가 가능하지만 서버 자원측면에서 안좋기에 가급적 클라이언트에 재요청하는 방식

TCP 헤더의 모습

 

Source port - 출발지의 포트 번호

Destination Port - 목적지 포트번호

Sequence number -  바이트 단위로 순서화되는 번호로 TCP 세그먼트 첫번째 byte에 부여되며 이를통해 3way handshake가 이뤄지고 흐름제어 기능을 제공한다 -> 데이터 첫 번째 비트에 할당되는 임의의 32비트, 한번의 연결에서 한번만 사용되며 동일한 연결에서 다른 데이터 전송을 위해 다른 시퀀스 번호를 사용해야한다.

Acknowledgment Number(확인번호) - 수신을 기다리는 다음 byte번호 (마지막으로 수신에 성공한 번호의 +1)

Reserved - 에약된 필드 (현재는 미사용)

Window - 자신의 수신 버퍼 여유용량 크기를 통보하여 얼만큼의 데이터를 받을수 있는지 보여줌

Offset - 헤더 길이 필드이며 Ipv4와 동일하게 /4를 진행한후 2진수로 작성됨

Urgent Pointer - 어디서부터 긴급값인지 알려주는 플래그 (TCP Flags의 U와 세트!)

TCP Flags

  • U (Urgent, 긴급비트) - 내가 지금 보내는 데이터의 우선순위가 높음 (Urgent Pointer과 세트)
  • S (SYN 비트, 동기화비트) - 동기화 비트, 상대방과 연결을 시작할떄 사용되는 플래그 (핸드쉐이크에 사용)
  • A (ACK 비트, 승인 비트) 요청에 대한 응답을 진행할때 사용되는 플래그 (핸드쉐이크에 사용)
  • P (Push 비트) - Tcp 버퍼가 일정한 크기만큼 쌓여야 넘기는데 이에 상관없이 계속 데이터를 밀어넣겠다 (유튜브 버퍼링)
  • R (Reset 비트) -  초기화 비트, 연결된 상태에서 어떤 문제가 발생했을때 연결을 리셋하게됨
  • F (Fin비트, 종료비트)

 

User Datagram Protocol (UDP)

  • 비연결성 - 데이터를 보내는데 연결이 필요하지 않다. -> 핸드쉐이크를 통한 연결상태 점검과정을 생락하고 일방적으로 보냄
  • UDP의 경우 단순하게 테이터만 보내기 때문에 신뢰성을 보장하지 않으나 가볍고 속도가 빠르다 -> 데이터를 효율적으로 보내야하는 응용프로그램, 게임은 직접적인 기능떄문에 UDP를 사용한다.
  • IP와 비슷하되 Port와 체크섬이 추가된다
  • 데이터그램 방식 - 데이터 전송 전에 송/수신자 사이에 가상 회선 (논리적 경로)를 설정하지 않고, 패킷들이 각기 독립적으로 전송되는 방식 -> 이로인해 전송되는 순서가 바뀔 여지가 있다.

체크섬 - 중복검사의 일종으로 송신된 자료의 무결성을 보호하는 방법이다. 주로 해쉬값 비교를 통해 이뤄지며 

 

 


3way handshake 연결과정

1. SYN 요청 (클라이언트 -> 서버) -> 클라이언트가 서버에 연결 요청을 하기위해 SYN 데이터를 보낸다

  • SYN -1, ACK - 0
  • 해당 과정에서 window크기, 최대 세그먼트 크기 등 정보를 같이 보낸다 (window가 2000비트, 최대 세그먼트 크기가 200비트인경우 최대 10개의 세그먼트가 전송된다)

2. SYN + ACK (서버 -> 클라이언트) -> 요청을 받은 서버는 접속요청에 응답하기 위해 (SYN + ACK) 데이터를 보낸다. 해당 포트상태

  • 서버측 클라이언트는 SYN, ACK로 응답한다
  • ACK는 여기에 window크기, 최대 세그먼트 크기 등 정보를 같이 보낸다 -> window가 2000비트, 최대 세그먼트 크기가 200비트인경우 최대 10개의 세그먼트가 전송된다
  • SYN에서 사용되는 시퀀스 번호와 클라이언트의 SYN과 다르며 서버는 자신의 window와 최대 세그먼트 크기를 클라이언트에 전달한다. (ACK의 승인번호는 수신된 시퀀스 번호보다 1만큼 크다)
  • ACK - 1, SYN - 1 (SYN이 1인 이유는 자신도 정상적으로 받았음을 의미하면 동시에 ACK를 1로 바꿔 응답할 준비가 되었음을 알림)

3. ACK (클라이언트 -> 서버) -> 서버의 승인이 떨어졌으니 자신이 필요로 하는 데이터를 보낸다.

  • SYN에서 사용되는 시퀀스 번호와 클라이언트의 SYN과 다르며 서버는 window와 최대 세그먼트 크기를 클라이언트에 전달한다. (ACK의 승인번호는 수신된 시퀀스 번호보다 1만큼 크다)
  • ACK - 1, SYN - 0 (연결이 완료되었기에 SYN은 0으로 바꿔버리고 연결간 데이터 전송을 위해 ACK는 1 유지)

 

3way handshake 종료과정

 

1. FIN (클라이언트 -> 서버) -> 사용이 끝났으니 종료할거라 플래그를 보냄.

  • 임의의 시퀀스 번호로 메시지를 서버로 전달
  • FIN - 1, ACK - 0 (FIN은 끝임을 알리기 위해 1로 변경, 연결을 끊기 위해 ACK는 0으로 변경)

2. ACK + FIN (서버 -> 클라이언트) -> FIN에 대한 응답을 잘 수신했고 나도 끊기위해 FIN 플래그를 보냄

  • SYN에서 사용되는 시퀀스 번호와 클라이언트의 SYN과 다르며 서버는 window와 최대 세그먼트 크기를 클라이언트에 전달한다. (ACK의 승인번호는 수신된 시퀀스 번호보다 1만큼 크다)
  • 서버는 클라이언트의 플래그를 FIN - 1, ACK - 1 (ACK는 클라이언트가 보낸 FIN을 정상적으로 받았음을 알리기 위해 1로 변환, FIN은 서버도 클라이언트와 끊음을 알리기 위해 1로 변환)
  • 해당 과정이 끝날경우 클라이언트에서 서버측 연결은 종료된다

3. ACK (클라이언트 -> 서버) -> 연결 정지에 대한 서버의 승인이 떨어졌으니 윗단계에서 끊고 동시에 정상적으로 종료됨을 알리는 데이터를 보낸다.

  • 클라이언트는 FIN을 수신후 ACK 플래그 1 설정, 서버의 FIN 시퀀스 번호보다 1만큼 큰 승인버호를 클라이언트로 보낸다 (진짜 끝낸다고 요청을 보내면서 클라이언트의 FIN플래그도 0으로 바꾼다)


상단의 이론을 진행하며 IP가 어떤식으로 소통하는지 확인하였다.
그렇다면 우리는 실질적으로 100.100.100.1이 아닌 naver.com과 같은 형태로 진행되는데 이에 대해서도 설명하겠다.


DNS(Domain Name System)

 

IP만 알면 되는데 DNS를 사용하는 이유 - IP는 기억하기 어렵고 IP는 변경될 우려가 있다

  • 서버에서 망 사용료를 연체하여 해지됬으나 이후 다시 IP를 개설하여도 이 사실을 모르는 사람들은 대다수가 기존의 사이트로 돌아오지 못할것이다.
  • google에 접속하려고 할때 200.200.200.2라고 할경우 이것이 어떤 사이트인지 구분이 어렵고 google과 연관된 사이트라고 해도 IP를 다른곳에서 가져가버릴경우 200.200.123.4.. 220.324.123.2.. 이런식으로 연결해놔야 하기에 굉장히 불편하다.

그리하여 DNS라는 시스템을 고안하였으며 단순한 도메인명(google.com)만 입력할경우 이에 알맞는 IP로 찾아가게 되는것이다.

 

 

URL, URN, URI

URI (Uniform Resource Identifier) - 통합 자원 식별자를 의미한다.

  • 인터넷에 있는 자원을 나타내는 유일한 주소를 의미하며 쉽게 말해서 URN + URL 두개를 합친 상위의 개념이다.

URN (Uniform Resource Name) 

  • URI의 표준 포맷중 하나로 이름으로 리소스를 특정하는 URI이다.
  • URN은 리소스를 영구적이며 유일하게 식별이 가능한 URI다.
  • 실제 자원을 찾기 위해선 URN을 URL로 변환해 이용한다.
  • 리소스에 어떻게 접근할지 명시하지 않고 경로와 리소스 자체를 특정하는것 -> 크롬에 PDF 파일 같은걸 던져보면 알것이다. (file://0.0.0.123/)

URL (Uniform Resource Locator)

  • 네트워크 상에서 웹페이지 ,이미지, 동영상등 파일이 위치한 정보를 나타낸다.
  • 어떻게 리소스를 얻고 어디서 가져올지 명시
  • www.google.com

HTTP의 역사

HTTP/0.9 - GET 메서드만 지원, HTTP 헤더X

HTTP/1.0 - 메서드(post,get,delete...), 헤더, 상태코드(200,300...) 추가

  • 요청헤더 - http 버전이 생김
  • 응답헤더 - 상태코드와 content-type이 생겨 html파일 외의 다른 타입의 파일도 전송가능
  • 단기 커넥션 - connection 하나당 1개의 요청, 1개의 응답만 처리가능 -> 상단의 비연결성과 비슷한 맥락 

HTTP/1.1 - 가장 범용적으로 사용됨

  • Persistent connection - 지정된 timeout 동안 연속적인 요청 사이에 커넥션을 닫지 않음 -> 비 연결성에 약간의 여유를 주었다
  • Pipelining - 커넥션에서 응답을 기다리지 않고 순차적으로 여러 요청을 연속적으로 보내 그 순서에 맞춰 응답받아 지연시간을 줄이는 방식 -> Head of Line Blocking같은 문제점이 많아 사장됨.
  • Head of Line Blocking - 우선순위로 들어온 응답시간이 길어질경우 그 뒤에 있는 응답시간도 길어진다.

HTTP/2.0 - HTTP 1.1 성능개선 + 확장

  • 메시지 전송방식의 변화 : 바이너리 프레이밍 계층 사용
  • 파싱, 전송속도 증가
  • 오류 발생 가능성 저하
  • 멀티플랙싱
  • HPACK 압축 - 헤더 중복값 개선

HTTP/3.0 - TCP대신 UDP를 이용한 QuIC 프로토콜 사용

  • 3.0 미만은 전부 TCP 프로토콜을 활용했으나 해당 버전부턴 UDP를 사용

 

클라이언트와 서버를 구분해야 하는 이유 -> 각자의 역할에 집중(독립적인 발전) 가능하기 때문이다.

  • 리퀘스트, 리스폰 구조로 클라이언트는 서버에 요청을 보내고 응답을 대기하다 메시지가 오면 확인만 하면 된다
  • 이것은 곧 서로 독립성을 의미하며 단적인 예시로 서버가 방금까지 JAVA를 쓰다 C로 넘어가도 클라이언트는 이것과 상관없이 그냥 요청만 하면 서버에선 이를 확인하고 보내줄수 있다
  • 서버에선 비즈니스 로직 및 서비스만 구현하고 만일 문제가 발생할경우 클라이언트는 문제가 고쳐지기 전까지 다른작업을 진행하다 추후 완료되었을때 다시 접속만 하면 된다.

 

'CS' 카테고리의 다른 글

JS파일 가져오기 로컬, 원격 차이  (0) 2024.08.03
크로스 도메인,SOP, CORS, XSS,  (0) 2024.01.25
HTTP 헤더  (0) 2023.05.06
난독화  (0) 2023.05.03
개발방법론  (0) 2023.05.02

HTTP요청이 생기면 브라우저는 이에대한 HTTP 요청메세지를 생성, TCP/IP 프로토콜을 활용해 웹서버에 요청한뒤 브라우저는 웹 서버로부터 HTTP 응답을 받는다. (전송계층 프로토콜 - TCP, 네트워크 계층 프로토콜 - IP)

그리고 이것에 대한 간단한 머릿글의 형태로 받는것이 헤더이다. (헤더인증, 캐싱, 쿠키, 보안등 다양한 종류가 있다)

여담으로 TCP/IP의 경우 인증, 보안부분에서 취약하고 한다 (암호화가 된경우 암호화의 의미는 몰라도 암호화된 메세지 자체는 엿볼수 있으며 이를 막기위한 방법이 SSL,TLS이다)

 

HTTP(Hyper Text Transfer Protocol)

HTML문서와 리소스를 가져올수 있도록 하는 프로토콜로 웹 브라우저와 웹 서버간 통신을 목적으로 만들어졌다. (HTTP헤더는 대소문자를 구분하지 않는 이름과 콜론(:) 다음에 오는 값(줄 바꿈 없이) 이뤄져있으며 값 앞에 붙은 빈 문자열은 무시된다.

 

헤더(header)

  • 주로 데이터가 저장되거나 전송되는 데이터 블록의 맨 앞에 위치한 보충 데이터 (머릿글, 제목, 서론같은 개념이며 헤더 뒤에 이어지는 데이터는 페이로드 또는 바디라 불린다.)
  • 데이터 블록은 하단과 같으며 헤더는 데이터 블록 최상단에 위치하고있다. (우리가 사용하는 통신의 바디값은 데이터 계층에 존재하며 특정 프로토콜의 헤더 내용은 특정 프로토콜의 기능을 제공하기 위한 정보를 담고있다.)
  • HTTP헤더는 HTTP메세지(요청/응답)와 본문에 대한 정보를 말해주는데 해당 메세지가 제공하는 기능에 대한 최소한의 정보가 정리되는 요약본이다. (쉽게말해 머릿글 같은것) -> 만일 불필요한 내용을 담을경우 데이터 크기가 커져 빠른 전송이 불가능하기에 꼭 필요한 내용만 담는다.
  • 평문(암호화를 하지 않은) 통신이기에 도청이 가능하며 통신 상대방을 확인하지 않아 위장이가능하다. (TCP/IP자체가 통신 경로의 도중에 엿볼수 있다는 단점이 있다)


 

헤더의 분류

프록시 처리 방법에 따른 분류 

  • 요청 속도를 올리기 위하여 중간에 대체자(Proxy)를 두고 캐시하여 사용하는 방법이다
  • 종단간 헤더 (end-to-end) - 메세지의 최종 수신자에게 전송되어야 하며 중간 프록시는 반드시 종단간 헤더 원상태를 재전송하며 캐시는 이를 저장해야한다. 
  • 홉간 헤더 (hop-by-hop) - 단일 전송 - 레벨 연결에서만 의미있으며 프록시에 의해 재전송,캐시가 되어선 안된다.

헤더는 크게 4가지로 나눌수 있다. (개발자 도구를 키면서 보기를 권장한다..)

1. General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.

  • Data(헤더 생성시점), Connection등 일반적인 정보가 포함된다. 
  • Connection : 클라이언트와 서버의 연결방식(전송 후 네트워크 연결 유지여부)을 설정하는것이며 Http/1.1은 keep-alive(연결유지)가 디폴트이다 (프록시에 더이상 전송되지 않는 헤드필더(hop-by-hop)를 지정)

2. Request header (응답 헤더): 패치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.

  • 웹브라우저가 서버에 요청하는것을 텍스트로 변환한 메세지
  • 응답에 대한 부가정보 및 콘텐츠에 대한 우선순위등 (Authorization이 여기 포함)

3. Response header (요청 헤더): 클라이언트 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.

  • 웹브라우저가 요청한 메세지에 대한 status 메세지

4. Entity header : 콘텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.

  • 엔티티 바디 정보로 실제로 주고받는 컨텐츠 타입 또는 길이 같은 메세지 바디에 들어가는 내용에 관한 헤더가 들어가는 헤더
  • Content-Encoding - 미디어 타입을 압축하기 위해 사용되며 이것을 통해 클라이언트는 본문의 압축방식을 알수있다.
  • 미디어 타입 (MIME Type(구), media type) - 파일의 형식을 나타내는 문자열로 파일과 같이 송신될때 Content의 형식을 나타내기 위하여 사용 (Audio/ogg는 오디오파일로, image/png는 그림파일로 분류하며 특정한 타입이 없는 바이너리 타입은 application/..으로 나타난다)


HTTP 헤더의 특성

1. 비연결성(connectionless) 

  • 클라이언트와 서버가 연결을 맺은후 응답이 끝나면 기존의 연결을 끊는것 (단발적인 연결)
  • HTTP가 계속 연결되면 서버는 다수의 클라이언트(유저)와 연결을 유지해야하며 이에 따른 리소스가 발생하는데 이를 단발성으로 바꾸고 리소스를 줄여 더 많은 연결을 추구한다.
  • 서버에선 반복되는 요청에도 매번 연결, 해제의 과정을 수행해야 하므로 오버헤드가 발생할 여지가 있다.
  • 오버헤드를 줄이기 위해 HTTP의 KeepAlive(연결유지)속성을 사용해 주기적으로 패킷을 보내는 방식을 채택하였다(만일 반응이 없을경우 접속을 끊는다.)
  • 콘서트 티켓팅을 한다고 했을때 서버측은 실시간으로 예약, 예약취소가 이뤄지나 접속한 유저의 웹사이트에선 예약이 가능하다는 차이점이 발생한다. (공석이라고 나오지만 클릭하면 예약석이라고 나타나는점)

패킷 - 패킷교환 네트워크에 의해 전달되는 형식화된 데이터단위

 

2. 무상태성(stateless) 

  • 비연결성으로 인해 이전에 어떠한 상태를 갖고있는지 알수 없는데 로그인을 했지만 다른 페이지로 이동했을때 로그인을 했는지 안했는지 알지 못해 재로그인을 요청할수 있다 즉, 매번 새로운 인증을 진행해야하는 단점이 생긴다.(접속 -> 로그인 -> 상품클릭 -> 로그인 -> 주문 -> 로그인...)
  • 서버가 클라이언트의 상태를 보존하지 않는것으로 서버의 확정성은 용이하나 클라이언트가 추가적인 데이터를 전송해야하는 단점이 있다.  (상태유지 - 요청을 받은 서버가 기억하고 있는것으로 여기선 로그인을 유지하지 않는다고 이해하면 된다.)
  • 로그인이 필요 없는경우 상관없으나 로그인이 필요한경우 쿠키, 세션,토큰을 이용해 상태를 유지하며 이러한 상태 유지는 최소한으로만 사용한다.
  • 쿠키와 (브라우저 저장), 세션(DB 저장), 토큰의 등장으로 비연결성, 무상태성이 보완되기 시작

쿠키 - 서비스를 운영하려면 서버가 클라이언트를 기억해야하는 경우가 많은데 쿠키라는것을 저장하여 서버가 클라이언트를 식별하도록 한다 (사용자의 정보가 브라우저에 저장되기에 위변조 가능성이 높다)

세션 - 쿠키의 위변조 가능성을 방지하기 위해 나타난것으로 서버에 사용자 정보를 저장하는것

구분 HTTP 요청 메세지 HTTP 응답 메시지
Startline 메서드, 경로, 프로토콜의 버전 프로토콜의 버전, 상태 코드, 상태 텍스트
헤더 요청한 HTTP의 헤더 응답에 설정한 HTTP 헤더
바디 HTTP요청이 POST인 경우에 한정해서 추가됨 요청에 대한 응답(201,204는 공란)

상태 텍스트 - HTTP/1.1 404 Not found

상태 코드 (Status-code) - 404

 

HTTP코드의 종류

  • 1xx(정보) - 요청을 받았으며 기존 프로세스를 계속 진행합니다.
  • 2xx(성공) - 요청을 성공적으로 받았으며 정상확인 및 수용하였습니다.
  • 3xx(리다이렉션) - 요청 완료를 위해선 추가적인 작업이 필요합니다.
  • 4xx(클라이언트 오류) - 요청의 문법이 잘못되거나 요청처리가 불가합니다.
  • 5xx(서버 오류) - 서버가 명백히 유효한 요청에 대해 충족을 실패했습니다

HTTP메서드 종류

  • GET (멱등성 보장)
    • 데이터(Read)를 읽거나 검색(Retrieve)할때 사용되는 메서드
    • 성공시 XML 또는 JSON과 200코드리턴, 에러 발생시 404,400에러 발생
    • HTML GET요청시 모든 필요한 데이터를 URL 주소 끝에 파라미터로 포함해서 요청하며 이 끝부분을 쿼리스트링(QueryString) 이라고 한다.
    • 오직 데이터를 읽어올때만 사용하기에 idempotent이 보장된다 (계속 조회해도 리소스 변동 없음)
  • POST
    • 새로운 리소스를 생성(Create)할때 사용되며 주로 하위 리소스를 생성할때 사용하며 추가 리소스를 생성한다는 점에서 안전하지도, idempotent하지도 않다 -> 덮어쓰기라고 생각하면 된다.
    • 성공시 주로 201코드(게시물 작성, 회원 가입 등 신규 데이터를 서버에 덮어쓰는 작업이 성공시)
    • 전송해야할 데이터를 HTTP 메세지 Body에 담아 전송하며 브라우저 기록에 남지 않는다 (캐시 및 북마크 불가)
    • HTML POST 요청시 추가적인 데이터를 body에 포함해서 요청할수 있다.
  • DELETE (멱등성 보장)
    • 서버에서 요청한 URL리소스를 삭제하도록 요청 (클라이언트는 항상 삭제한다고 생각하지만 요청을 무시할수도 있다)
    • 동일한 요청을 하여도(이미 삭제된걸 요청해도) 삭제된 결과는 동일하다.
  • PUT (멱등성 보장)
    • 결과를 대체하기에 동일한 요청을 하여도 최종결과는 같다
  • OPTIONS (preflight)
    • 브라우저가 서버에게 지원하는 옵션을 요청 및 허가된 요청에 한해서 전송하기 위한 보안상의 목적 (조건부)
    • 통신옵션을 확인할때 사용되며 어떤 Method, header, content type을 지원하는지 알수있다. (Content type이 표준이 아닐경우 Option을 넣는것)

멱등성 - 자동복구 매커니즘으로 "서버가 타임아웃으로 정상적인 응답을 못줬을때 클라이언트가 동일한 요청을 다시해도 되는지"에 대한 근거

타임아웃 - 일정 시간내에 완료하지 못한경우 발생하도록 설계 (1분간 접속 안될경우 에러가 나타나는것)

GET과 POST 비교

  GET - URL에 값이 저장됨, 가져오기 POST - URL에 값이 저장되지 않음, 덮어쓰기
History
(기록)
브라우저 히스토리 저장
(파라미터가 URL의 일부분)
파라미터는 브라우저 히스토리에 저장 X
Bookmarked
(즐겨찾기)
즐겨찾기 가능
(요청한 파라미터 자체가 URL로 인코딩)
즐겨찾기 불가
요청 파라미터에 request URL이 나타나지 않음
button/re-submit
behaviour
(재클릭, 재 제출)
브라우저 캐시에 HTML이 저장되어있다면
서버에 submit되지 않는다.
브라우저가 보통 사용자에게 데이터가 다시
submit되어야 한다고 alert을 준다.
Encoding type
(enctype attribute)
(인코딩 방식)
ASCII characters만 허용 제한없음
Parameters
(매개 변수)
전송 가능하지만 URL에 넣을 수 있는 파라미터 데이터가 제한된다. 통상적으로 2K 서버에 파일 업로드하는 것을 포함하여 파라미터를 전송할 수 있다.
Security
(보안성)
상대적 약세
(데이터가 URL의 일부로 전송 및 브라우저 히스토리에 저장,서버에 플레인 텍스트로 로그 존재)
상대적 우세
(파라미터들이 브라우저 히스토리나 서버 로그에 저장되지 않기때문)
Usability
(유용성)
URL에 전부 보이기 때문에 비밀번호등 민감한 정보들을 전송에 사용이 금지 숨겨지기 때문에 비밀번호와 같은 민감한 정보를 전송하는데 사용된다.
Visibility
(가시성)
GET 메소드는 모두에게 보여진다. (브라우저 주소창에 보여지고 전송가능한 크기도 제한된다.) POST 메소드는 URL에 보여지지 않는다.
(Body에서 보인다)
Cached
(캐시)
idempotent하기 때문에 캐시 O
(같은 요청을 여보내도 항상 같은 응답이 온다.)
idempotent하지 않아 캐시 X
(같은 요청을 여러 번 보내도 다른 응답이 올 수 있다.)

전체 메서드 비교 

'CS' 카테고리의 다른 글

크로스 도메인,SOP, CORS, XSS,  (0) 2024.01.25
IP, DNS, HTTP  (0) 2023.07.09
난독화  (0) 2023.05.03
개발방법론  (0) 2023.05.02
인라이닝  (0) 2023.04.20

소스코드를 인터넷에 올리거나 고객에서 납품할때 프로그램 전반이 단순한 텍스트(코드)로 되어있기에 코드만 긁어가면 똑같은 서비스를 그대로 출시하거나 상업적 목적에 사용될 우려가 있다.

이러한 문제를 해결하기 위해 크게 3가지 기법(난독화, 바이너리 암호화, 패킹)이 있는데 해당 포스팅에선 주로 난독화에 대해 다루려고 한다.

바이너리 암호화

소스코드를 난독화 하는게 아닌 디컴파일 자체가 어렵도록 바이너리 자체를 암호화 하는것으로 복호화 없이는 실행될수 없는 파일이다.

복호화(디코딩)를 하기 위해선 별도의 실행프로그램이 존재해야하는데 이 프로그램을 로더라고 한다.

 

패킹 (Packing)

실행파일을 암호화하거나 압축하여 소스코드를 볼수 없도록 하는것 (패킹을 진행하는 프로그램을 패커라 칭한다)


난독화

프로그램을 변화하는 방법의 일종으로 코드를 읽기 어렵게 만들어 역공학을 통한 코드탈취를 막는기술이다.

JWT토큰, Base64, Cyberchef등이 이에 해당하는것이라 볼수있다.

  • 바이너리에서 심볼 정보를 제거하거나 변경하는것
  • 필요 이상으로 복잡한 코드 및 아무 의미도 없는 코드의 삽입
  • 각 함수를 인라이닝 및 반복되는 구문을 합쳐 익명함수를 만듬
  • 인코딩

장점

  • 난독화기는 난독화를 진행하면서 불필요한 코드를 찾아 제거하여 코드의 최적화를 만들어준다.
  • 리버스 엔지니어링을 어렵게 해주는것인데 이것은 오픈소스 플랫폼에서 코드탈취를 막아줄수 있다

단점

  • 난독화된 코드의 복잡성에 따라 코드를 해석하는데 긴 시간이 든다.
  • 난독화는 그저 해석이 어렵게 할뿐 시간만 주면 해석 못할건 아니다
  • 일부 백신 프로그램은 사이트에 난독화 코드가 있는경우 이것을 바이러스 사이트로 인지한다

코드 난독화의 종류

이름변경 난독화

  • 변수의 이름을 바꿔 기존 의도에 혼란을 주는것

데이터 난독화

  • 집계 난독화 - 프로그램에 데이터가 저장되는 방식을 변경 (부모배열을 자식배열로 분할, 이를 프로그램 다른위치에 참조되도록 하는것
  • 저장 난독화 - 데이터가 메모리에 저장되는 방식을 변경으로 로컬 저장소 및 전역 저장소 사이에 변동을 주는것
  • 순서 난독화 - 프로그램, 코드스니펫의 동작의 변경없이 데이터의 순서를 변경
  • 문자열 암호화 - 읽을수 있는 문자열을 모두 암호화하여 읽을수 없는 코드를 생성 (프로그램이 실행되는 런타임시점에 암호해독이 필요하다)
  • 제어/코드 흐름 난독화 - 제어가 코드베이스의 한 섹션에서 다른 섹션으로 전달되는 방법은 프로그램 의도를 결정하는데 중요한 역할을하는데 이 사이에 사용되지 않을 불필요한 구문(데드코드)를 추가하는것

코드스니펫 (Code Snippet) - 코드조각, 재사용 가능한 소스코드를 가리키며 코드의 일부를 복붙할때 사용하기도 한다

디버그 난독화

  • 디버그 정보는 프로그램 흐름, 디컴파일, 재컴파일을 통해 프로그램의 결함 또는 핵심 정보를 아는데 사용되는데 이를 기반으로 코드의 탈취우려가 있다.
  • 디버그 정보에 대한 엑세스 중지하여 식별 가능한 정보의 제공을 일절 차단하는것

주소 난독화

  • 변환된 코드가 실행될때마다 코드의 가상주소와 프로그램의 데이터가 랜덤화가 진행
  • 리버스 엔지니어링 과정이 어려워지며 동시에 메모리 오류 취약점을 이용한 공격효과를 장담할수 없도록 만듦
  • 비 메모리 안전 언어(C,C+)를 사용하는경우 엑세스 오류같은 보안 취약성이 발생하는데  메모리 프로그래밍 오류를 이용하는경우

JavaScript 난독화

  • HTML의 난독화는 주로 HTML보단 JavaScript 위주로 변환된다 -> HTML을 해당 숫자코드로 변환, 복수의 메서드를 조합하여 수행 하는게 통상적 이지만 주로 서버측 보안 위주로 이뤄지기에 HFO (HTML Field Obfuscation) 는 생략되는경우가 많다
  • 주로 컴파일전 원본 소스코드 자체를 난독화하는 방식이 사용된다.
  • 문자열 배열 인코딩, 유니코드 표현식으로 변환, 이스케이프 시퀀스에 유니코드 작업을 수행하는 등 작업을 진행
  • 런타임 속도가 느려짐

이스케이프 스퀀스 (escape sequence) - 프로그래밍 언어 특성상 표현불가능한 기능, 문자를 표현해주는것 (제어 시퀀스, 확장 비트열, 이스케이프 문자라고도 한다 - \n, \\, \"...)

Java 난독화

  • Proguard, Dexguard - 자바 난독화 라이브러리
  • 상용프로그램은 배포전 난독화를 한번 진행하고 배포를한다.
  • 자바는 바이트코드로, 안드로이드는 dex로, 닷넷은 DLL로 컴파일하여 난독화 

'CS' 카테고리의 다른 글

IP, DNS, HTTP  (0) 2023.07.09
HTTP 헤더  (0) 2023.05.06
개발방법론  (0) 2023.05.02
인라이닝  (0) 2023.04.20
메모리 단편화  (0) 2023.04.08

TDD(Test-Driven-Development)

테스트 주도개발

장점

  • 개발할때 주기적으로 테스트를 진행하며 개발하는 방식
  • 실패해도 문제 없도록 테스트 케이스를 먼저 작성후 개발을 진행 (일단 실행만 되게 만들고 나중에 깔끔하게 고침)
  • 주기적인 테스트로 인해 코드의 문제를 금방 알수있고 객체지향적이며 이를 토대로 확장에 용이하다

단점

  • 테스트 코드를 넣음으로써 작성해야하는 코드량이 늘어기에 빠르게 생산이 필요한경우엔 기피된다. 
  • 모든 상황에 대해 테스트 코드를 작성해야 한다. (물건 장바구니에 넣었다 뺐다 10번 한뒤 테스트..)

 

 

BDD(Behavior-Driven-Development)

행동 주도 개발

  • 요구사항에 집중하여 테스트를 개발 (TDD + 시나리오)
  • TDD에 시나리오(가상의 사건) 개념을 더한것을 행동이라 칭하고 이를 기반으로 개발하는 방식 (테스트보단 비즈니스 요구사항에 집중하여 테스트 케이스를 개발)
  • 메서드 이름을 "어떤 행위를 해야한다"라는 식의 문자로 작성해 행위(기능)를 위한 테스트에 집중
  • Buisiness Requires과 end-user(최종 소비자) 관점에서개발을 진행하는 방식
  • TDD가 테스트를 각 기능에 대해서만 테스트헀다면 BDD는 결합테스트 + 시나리오 테스트까지 확장하여 테스트 케이스를 진행하는것 (물건 3번쯤 장바구니에 넣고 뺏다가 홈화면 갔다온뒤 20분뒤 돌아와서 다시 구매할경우?...)

 

DDD(Domain-Driven-Development)

도메인 주도 개발

  • 도메인 패턴을 중심으로 설계하는 방식
  • 데이터 중심의 접근법이 아닌 순수 도메인의 모델과 로직에 집중
  • 커뮤니케이션에서 분석, 설계, 구현까지 통일된 방식으로 협업하며 규칙이 동일한 통일된 방식으로 진행

(도메인 - 분야. 집합, 비즈니스영역이나 여기선 사건이 발생하는 집합이라 생각하면 이해가 쉽다.)

 

  TDD DDD BDD
TDD - 사용자 중심 테스트 케이스 중심
DDD 사용자 중심 - 비즈니스 로직 중심
BDD 테스트 케이스 중심 비즈니스 로직 중심 -

 

'CS' 카테고리의 다른 글

HTTP 헤더  (0) 2023.05.06
난독화  (0) 2023.05.03
인라이닝  (0) 2023.04.20
메모리 단편화  (0) 2023.04.08
캐시에 대하여  (0) 2023.04.07

+ Recent posts