본문 바로가기
스터디일지

CS 면접 질문 대비 21번 ~ 30번

by 똥쟁이핑크 2023. 10. 25.
  1. RDBMS의 정규화에 대해 설명해주세요.
    - 나의 답변 : 
    DB 서버의 메모리를 낭비하지 않기 위해 하나의 테이블을 식별자로 가지는 여러개의 테이블로 나누는 과정이다.
    정규화에는 종류가 있는데 
    제 1 정규화는 테이블에 반복되는 컬럼값들이 있다면 그것들을 분리해서 새로운 테이블을 만드는 것이다. 제 1정규화의 특징은 부모 테이블에 존재하는 Primary Key(식별자)는 항상 자식 테이블의 Foreign Key 로 전이 된다
    제 2 정규화는 제 1정규화의 결과물에서 식별자 즉 기본키가 하나의 컬럼이면 진행하지 않지만 2개 이상이면 반드시 해야 한다. 식별자 전체 컬럼이 아닌 일부 컬럼에 대해 의존적이면 분리해서 새로운 테이블을 생성해야 한다.
    제 3 정규화는 식별자가 아닌 컬럼에 의존적이면 이것을 분리해서 새로운 테이블을 생성한다.
    제 4 정규화는 多: 多 관계를 1:多 또는 多:1 관계로 바꾼다.

    참고한 사이트 : https://jepi.tistory.com/132,

    - 모범 답안 :
    **RDBMS에서 정규화(Normalization)는 데이터베이스 설계의 과정 중 하나로, 데이터의 중복성을 최소화하고 데이터 일관성과 무결성을 유지하기 위해 테이블을 구조화하는 프로세스입니다. 정규화는 관계형 데이터베이스의 성능, 유지보수 및 확장 가능성을 향상시키는 데 도움이 됩니다.***
    *주요 정규화 단계에는 다음과 같은 것들이 있습니다:**

    **제1 정규형(1NF):**
    각 열(Column)은 원자적인 값만 가지며, 테이블에 중복된 데이터가 없어야 합니다. 각 행(Row)은 고유한 식별자(Primary Key)를 가져야 합니다.

    **제2 정규형(2NF):**
    모든 비주요 속성들이 기본키에 완전히 종속되어야 합니다. 즉, 비주요 속성들은 기본키 전체에 의존해야 하며 부분적으로 의존해서는 안 됩니다.- 예를 들어, "학생" 테이블에서 "학번: 12345"라는 기본키 값을 가진 행을 선택한다면 그 행에 있는 이름과 나이 값은 오직 해당하는 학번인 12345와 관련된 정보입니다.따라서 이름과 나이는 부분적으로 의존하지 않고 전체적으로 기본키(학번)에 의존해야 하며, 다른 어떤 값도 필요하지 않습니다.

    **제3 정규형(3NF):**
    비주요 속성들 간의 이행적 종속 관계를 제거해야 합니다. 즉, 한 속성의 값을 알면 다른 비주요 속성들의 값을 추론할 수 없어야 합니다.- 예를 들어, "학생" 테이블에 학번, 이름, 주소라는 비주요 속성들이 있다고 가정해봅시다. 여기서 학번에 따라 이름을 알 수 있고, 이름에 따라 주소를 알 수 있다면 이는 이행적 종속 관계입니다. 따라서 "학생" 테이블을 분리하여 기본 테이블인 "학생 정보" 테이블과 "주소" 테이블로 나눌 수 있습니다. 그리고 두 테이블 간의 관계(Relationship)을 설정합니다. 여기서 기본 테이블인 "학생 정보" 테이블은 학번과 이름 정보만을 가지며, "주소" 테이블은 학번과 해당하는 주소 정보를 가집니다. **추가적으로 보다 높은 정규형인 BCNF (Boyce-Codd Normal Form), 4NF (Fourth Normal Form), 5NF (Fifth Normal Form) 등도 있습니다. 이러한 단계를 거치면서 데이터베이스 설계자는 중복된 정보와 이상 현상(anomaly)을 최소화하고 데이터 일관성과 효율성을 개선할 수 있습니다.**-

    **BCNF (Boyce-Codd Normal Form):**
    BCNF는 제3 정규형을 만족하면서 모든 결정자(candidate key)가 함수적 종속성을 가지지 않도록 하는 것을 목표로 합니다.함수적 종속성이란 한 속성의 값이 다른 속성의 값을 결정하는 관계를 의미합니다.BCNF에 따라 테이블을 분해하여 함수적 종속성을 제거하고, 필요한 경우 관계(Relationship)를 설정하여 연결할 수 있습니다.-

    **4NF (Fourth Normal Form):**
    4NF는 BCNF를 만족하면서 다치 종속(Multivalued Dependency) 현상을 제거하는 것을 목표로 합니다.다치 종속은 한 테이블에서 A->B, A->C와 같은 함수적 종속성과 함께 B->C와 같은 다른 함수적 종속성이 존재하는 상황입니다.
    4NF에 따라 테이블을 분해하여 다치 종속 현상을 해소하고, 필요한 경우 관계(Relationship)를 설정하여 연결할 수 있습니다.-

    **5NF (Fifth Normal Form), 또는 PJ/NF (Project-Join Normal Form):**
    5NF는 다치 종속과 조인(JOIN) 연산에 대한 중복 현상(Dependency Preservation Anomaly)을 해결하기 위해 사용됩니다.다치 종속과 조인 연산으로 인해 발생하는 중복된 정보를 최소화하고 데이터 일관성 및 성능 개선에 초점을 맞춥니다.5NF에 따라 테이블 구조를 조정하여 중복된 정보와 조인 연산에 의한 문제점들을 해결할 수 있습니다.

    ## 정규화-
    **목적**
    데이터 일관성, 정확성 유지. 입력/업데이트/삭제 오류 및 복잡성 감소하는 것이다.
    데이터 중복 최소화하고 데이터 무결성 향상하는 것이다.
    중복된 정보를 줄여서 데이터를 깔끔하게 정리하여 정보를 찾거나 바꿀 때 실수할 확률을 낮추는 것이다.

    ### 제1정규형(1NF) :
    원자값 사용한다.모든 칸에는 하나의 정보만 넣어야한다. 예를 들어 이름 칸에는 이름만, 나이 칸에는 나이만 넣는 거이다. -
    **규칙** 모든 컬럼에 단일 값만 저장.

    ### 제2정규형 (2NF) :
    부분 함수 종속성 제거한다.제2정규형(2NF)은 데이터베이스에서 부분 함수 종속성을 제거해 데이터 중복을 최소화하고 효율적인 데이터 관리를 돕는 정규화 방법이다. 예를 들어, '학생ID', '과목', '성적', '교사' 속성을 가진 테이블에서 '학생ID'와 '과목'을 복합키로 하고, '교사' 정보가 '과목'에만 종속되어 있다면 이를 두 개의 테이블로 분리하여 '교사' 정보의 중복을 줄이고 관리를 용이하게 한다. -
    **조건** 1NF 만족해야한다. -
    **규칙** 복합키 전체에 종속된 비키 속성만 사용한다.

    ### 제3정규형 (3NF) :
    이행 함수 종속성 제거한다.제3정규형 (3NF)은 데이터베이스 설계에서 중복과 종속성 문제를 해결한다. 학생 정보 관리를 예로 들면 학생 이름, 반, 담임 선생님 정보가 저장되어 있고 반에 속한 학생이 여러 명이면 담임 선생님 정보가 중복되어 저장된다. 제3정규형을 적용하여 학생 정보와 반 정보를 분리 저장함으로써 담임 선생님이 바뀔 경우 한 곳만 수정하면 되어 데이터 관리가 효율적이고 일관성 있게 이루어지게 된다.즉 A -> B -> C 관계를 A -> B, B -> C로 바꾸는 것이다. -
    **조건** 2NF 만족해야한다. -
    **규칙** 키가 아닌 속성이 다른 키가 아닌 속성에 종속되지 않도록 한다.

    ### BCNF (Boyce-Codd Normal Form) :
    모든 결정자가 후보키이여야한다.BCNF는 제3정규형을 좀 더 강화한 버전으로, 함수 종속성을 더 엄격하게 다룹니다.이 정규형은 모든 결정자가 후보 키 집합에 속하도록 함으로써, 함수 종속성으로 인한 중복을 최소화합니다.예를 들어, 학생ID, 과목ID, 강의실 정보를 포함하는 테이블이 있다고 가정한다.함수 종속성: {학생ID, 과목ID} -> 강의실후보키: {학생ID, 과목ID}이 테이블은 제3정규형을 만족하지만 BCNF를 만족하지 않는다. 이는 강의실 정보가 과목ID에만 종속되어 있어서 발생하는 문제로 데이터 중복과 무결성 문제를 야기할 수 있다.
    BCNF를 만족시키기 위해서는 테이블을 `CourseClassroom`과 `StudentCourse` 두 개로 분리하여야 한다. 그러면 강의실 정보의 중복을 제거하고 과목ID에 따른 강의실 정보를 효과적으로 관리할 수 있게 된다. -
    **조건** 3NF 만족해야 한다. -
    **규칙** 모든 결정자가 후보키가 되도록 한다.

    ### 제4정규형 (4NF) :
    다치 종속성 제거한다.제4정규형(4NF)은 데이터베이스 내에서 다치 종속을 제거함으로써 데이터 중복을 최소화하고 무결성을 향상시키기 위한 정규형이다. 다치 종속이란 한 속성이 다른 두 속성에 독립적으로 종속되어 있는 경우를 말한다.예를 들어 학생의 취미와 언어 구사 능력을 한 테이블이 있다고 가정하자한 학생이 여러 취미와 여러 언어를 구사할 경우 이 정보들이 중복되어 저장된다.
    제4정규형을 적용해 학생-취미 관계와 학생-언어 관계를 별도의 테이블로 분리하면 데이터 중복을 줄이고 정보 관리가 편리해진다. 이는 데이터 무결성 향상에도 기여한다. -
    **조건** 3NF 또는 BCNF 만족해야한다. -
    **규칙** 모든 다치 종속성 제거한다.

    ### 제5정규형 (5NF)**
    조인 종속성 제거한다.제5정규형(5NF)은 데이터베이스에서 데이터의 중복을 최소화하고 무결성을 유지하기 위해 사용되는 정규화의 한 단계이다. 이 정규형은 조인 종속성을 기반으로 하며 한 테이블을 여러 개의 테이블로 분해하여 데이터 중복을 제거하고 데이터 관리의 효율성을 높인다.예를 들어 고객, 제품, 공급업체 정보를 포함하는 테이블이 있다고 가정한다면 각 고객은 여러 제품을 구매하고 각 제품은 특정 공급업체에 의해 공급된다. 또한 고객은 특정 공급업체와 거래한다.
    이 모든 정보를 하나의 테이블에 저장하면 데이터 중복과 무결성 문제가 발생할 수 있다.
    제5정규형을 적용해 테이블을 세 개로 분해하면, 데이터 중복이 감소하고 각 정보를 독립적으로 관리할 수 있어 데이터 무결성과 관리 효율성이 향상된다. -
    **조건** 4NF 만족해야한다. -
    **규칙** 모든 조인 종속성 제거한다.

  2. Primary Key, Foreign Key에 대해 설명해주세요.
    - 나의 답변 : 
    Primary Key는 기본키라고 부르며 DB의 테이블에서 유일하게 구분되는 Data-Key 이다.
    유일한 값이기 때문에 중복 값을 가질 수 없고 공백도 가질수 없다.
    Foreign Key는 외래키라고 부르며 어떤 한 테이블과 참조되는 다른 테이블 간의 연결되는 Primary Key 컬럼을 가진다.
    Foreign Key는 다른 Primary Key를 참조하는 속성 또는 속성들의 집합이며 참조하는 Primary Key와 같은 속성을 가진다.


    참고한 사이트 : https://www.incodom.kr/Primary_Key_%26_Foreign_Key,


    -모범 답안 : 
    **Primary Key (기본키):
    **기본키는 데이터베이스 테이블에서 각 행(row)을 고유하게 식별하는 열(column) 또는 열의 조합입니다.
    기본키는 해당 테이블에서 중복되지 않아야 하며, 모든 행은 기본키 값을 가져야 합니다.주로 식별자(identifier)로 사용되며, 예를 들어 학생 정보를 저장하는 테이블에서 "학번" 열을 기본키로 지정할 수 있습니다.
    기본키는 테이블 내의 각 행을 고유하게 식별하기 때문에 검색, 수정 및 삭제 작업 등에서 매우 유용합니다.

    **Foreign Key (외래키):
    **외래키는 한 테이블의 열(column)이 다른 테이블의 기본키(primary key)를 참조하는 역할을 합니다.
    외래키는 다른 테이블과의 관계(Relationships)를 형성하여 데이터 간의 일관성과 무결성(Integrity)을 유지하는 데 사용됩니다.예를 들어, "주문" 테이블에서 "고객 ID"라는 열은 "고객" 테이블의 기본키인 "고객 ID"와 연결됩니다.
    이렇게 함으로써 주문과 해당 고객 사이에 관계가 형성됩니다.
    외래키 제약 조건(Foreign Key Constraint)은 데이터베이스 시스템에서 외래키 값들을 검증하고 관리하는데 사용됩니다.
    이 제약 조건은 부모(참조하는) 테이블의 값과 일치하지 않거나 NULL일 경우에도 적용됩니다.

    **기본적으로 Primary Key와 Foreign Key는 서로 다른 개념입니다.
    Primary Key는 한 개체(entity, 예: 학생, 주문 등)를 고유하게 식별하기 위한 것으로 해당 열 자체가 Unique하고 Not Null 속성을 가집니다.
    반면에 Foreign Key는 다른 개체와의 관계를 형성하기 위한 것으로 다른 테이블의 Primary Key 값을 참조합니다.**

  3. HTTP 메서드에 대해 설명해주세요.
    - 나의 답변 : 
    주요 메서드 로는 GET, POST, PUT, PATCH, DELETE가 있는데 GET은 리소스를 조회하고 POST는 요청 데이터를 처리하는데 주로 등록하는데 많이 사용한다.
    PUT은 기존에 있는 데이터에 덮어쓰기 즉 수정을 하거나 해당 리소스가 없으면 생성한다.
    PATCH는 부분 변경 할 때 쓰이는데 여기서 PUT과 다른 점은 PUT은 전체를 변경하고 PATCH는 일부를 변경한다.
    DELETE는 삭제 할 때 사용한다.

    그 외에 메소드로는 HEAD, OPTIONS, CONNECT, TRACE가 있다.
    HEAD는 GET과 동일하지만 상태줄과 헤더만 반환하는데 주로 검사하는 용도로 사용한다. OPTIONS는 주로 CORS에서 사용하는데 대상 리소스에 대한 통신 가능 옵션이다.
    CONNECT는 대상 자원으로 식별되는 서버에 대한 터널을 설정하고 TRACE는 대상 리소스에 대한 경로를 따라 메세지 루프백 테스트를 수행 할때 사용한다.

    참고한 사이트 : https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A2%85%EB%A5%98-%ED%86%B5%EC%8B%A0-%EA%B3%BC%EC%A0%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC,


    -모범 답안 : 
    **HTTP 메서드**는 HyperText Transfer Protocol(HTTP)를 통해 웹 서버와 클라이언트 간에 데이터를 전송하고 통신하기 위한 행동을 정의하는 방식입니다.
    HTTP 메서드는 웹 애플리케이션에서 어떤 동작을 수행할지를 지정하며, 주요 역할은 다음과 같습니다:
    1. **GET**:
    - **GET 메서드**는 리소스를 요청하고 가져오는 데 사용됩니다.
    - 주로 정보를 검색하고 브라우저에서 웹 페이지를 요청하는 데 사용됩니다.

    2. **POST**:
    - **POST 메서드**는 데이터를 서버로 제출하고 리소스를 생성하거나 업데이트하는 데 사용됩니다.
    - 주로 사용자가 양식을 제출하거나 데이터를 전송하는 데 사용됩니다.

    3. **PUT**:
    - **PUT 메서드**는 리소스를 업데이트하는 데 사용됩니다.
    - 클라이언트가 리소스의 전체 내용을 업데이트할 때 주로 사용됩니다.

    4. **DELETE**:
    - **DELETE 메서드**는 리소스를 삭제하는 데 사용됩니다.
    - 특정 리소스를 삭제하고 데이터베이스 또는 서버에서 해당 리소스를 제거할 때 사용됩니다.

    5. **PATCH**:
    - **PATCH 메서드**는 리소스의 일부를 업데이트하는 데 사용됩니다.
    - 리소스의 일부를 수정하고 업데이트할 때 사용됩니다.

    6. **HEAD**:
    - **HEAD 메서드**는 GET과 유사하지만 실제 리소스 내용을 반환하지 않고 헤더 정보만 반환합니다.
    - 주로 리소스의 메타데이터를 검색하고 리소스가 존재하는지 확인하는 데 사용됩니다.

    **HTTP 메서드의 중요성**:
    - **상호작용**:
    HTTP 메서드를 사용하여 클라이언트와 서버 간의 상호작용을 정의하며, 웹 애플리케이션에서 사용자 요청을 처리합니다.-

    **RESTful 웹 서비스**:
    REST 아키텍처 스타일에서 HTTP 메서드는 CRUD(Create, Read, Update, Delete) 작업을 정의하며, RESTful 웹 서비스에서 중요한 역할을 합니다.-

    **보안**:
    올바른 HTTP 메서드 사용은 보안 측면에서 중요하며, 예를 들어 GET과 POST의 차이를 이해하고 사용자의 데이터를 보호하는 데 도움을 줍니다.

  4. CORS(Cross Origin Resource Sharing)에 대해 설명해주세요.
    - 나의 답변 : 
    CORS는 교차 출처 리소스 공유라고 하며 서버에서 요청이 들어오면 응답을 해주는데 CORS 정책을 지키는지 검사해서 안전한 요청을 보낸건지 검사하는 것이다.
    CORS에서 말하는 Origin은 프로토콜 - https:// + 도메인 - asde.com + 포트번호 - 80을 합친건데 CORS의 기본 동작은 브라우저에서 다른 Origin으로 요청을 보낼 때 Origin 헤더에 자신의 Origin을 설정하고 서버로 부터 응답을 받으면 응답의 Access-Control-Allow-Origin 헤더에 설정된 Origin의 목록에 요청의 Orign header 값이 포함되는지 검사한다.

    참고한 사이트 : https://blog.haeyum.me/cs/web/frontend/Browser/,


    -모범 답안 : 
    CORS는 출처가 다른 자원들을 공유한다는 뜻으로, 한 출처에 있는 자원에서 다른 출처에 있는 자원에 접근하도록 하는 개념입니다.
    직역하면, 교차되는 출처 자원들의 공유입니다. 다른 출처에 있는 자원을 요청한다고 하면, 이를 교차 출처 요청이라고 부릅니다.
    출처란 **Protocol + Host + Port** 3가지가 같으면 동일 출처(Origin)라고하며 https://가 프로토콜, example.com이 호스트, :443 이 포트번호입니다.이중 하나라도 다르면 다른 출처라고 합니다.
    CORS가 없이 모든 곳에서 데이터를 요청할 수 있게 된다면, 다른 사이트에서 원래 사이트를 흉내낼 수 있게 되면서 만약 기존 사이트와 완전히 동일하게 동작하도록 하여 사용자가 로그인을 하도록 하고, 로그인했던 세션 또는 토큰을 탈취하여 악의적으로 정보를 꺼내오거나 다른 사용자의 정보를 입력하는 등 해킹을 할 수 있다.
    하지만 이런 공격을 할 수 없도록 브라우저에서 보호하고, 필요한 경우에만 서버와 협의하여 요청할 수 있도록 하기 위해서 필요한 것입니다.

    > 추가질문어떤 방식으로 작동하나요?>
    CORS의 동작 방식은 단순 요청 방법과 예비 요청을 먼저 보내는 방법 2가지 방법이 있습니다.
    Simple request단순 요청 방법은 서버에게 바로 요청을 보내는 방법입니다.
    단순 요청은 서버에 API를 요청하고, 서버는 `Access-Control-Allow-Origin` 헤더를 포함한 응답을 브라우저에 보냅니다. 브라우저는 `Access-Control-Allow-Origin` 헤더를 확인해서 CORS 동작을 수행할지 판단합니다.서버로 전달하는 요청(request)이 아래의 3가지 조건을 만족해야 서버로 전달하는 요청이 단순 요청으로 동작합니다.
    - 요청 메서드(method)는 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 requestPreflight 요청은 서버에 예비 요청을 보내서 안전한지 판단한 후 본 요청을 보내는 방법입니다.
    Preflight 요청은 실제 리소스를 요청하기 전에 `OPTIONS`라는 메서드를 통해 실제 요청을 전송할지 판단합니다.
    `OPTIONS` 메서드로 서버에 예비 요청을 먼저 보내고, 서버는 이 예비 요청에 대한 응답으로 `Access-Control-Allow-Origin` 헤더를 포함한 응답을 브라우저에 보냅니다.
    브라우저는 단순 요청과 동일하게 `Access-Control-Allow-Origin` 헤더를 확인해서 CORS 동작을 수행할지 판단합니다.

  5. 브라우저의 작동방식에 대해서 설명해주세요.
    - 나의 답변 : 
    브라우저의 주요기능은 사용자가 서버에 데이터를 요청하면 브라우저 창에 사용자가 보기 쉽게 제공해준다. 데이터는 HTML 문서 형식으로 PDF나 IMG등 다른 형식일 수도 있다.


    참고한 사이트 : 


    -모범 답안 : 
    1) URL 입력 및 요청 사용자가 URL 을 입력하면 브라우저는 해당 주소의 웹 서버에 HTTP 요청을 보냄
    2) 서버 응답 및 데이터 수신 서버는 요청을 처리하고 HTML, CSS, JavaScript 파일 등을 브라우저에게 응답으로 보냄
    3) HTML 파싱 및 DOM 생성 브라우저는 HTML 을 파싱하여 Document Object Model (DOM) 트리를 만듭니다. 이 트리는 웹 페이지의 구조를 나타낸다
    4) CSS 파싱 및 CSSOM 생성 CSS 파일도 파싱되어 CSS Object Model (CSSOM) 트리가 생성됩니다. 이것은 페이지의 스타일을 정의합니다.
    5) 렌더 트리 생성 DOM 과 CSSOM 을 결합하여 렌더 트리를 생성합니다. 이 트리는 페이지의 시각적 표현을 나타내며, 각 요소의 크기와 위치를 포함한다
    6) 레이아웃 렌더 트리를 기반으로 브라우저는 각 요소의 크기와 위치를 계산한다
    7) 페인팅 계산된 스타일과 레이아웃 정보를 사용하여 화면에 페이지를 그린다. 여기에는 텍스트, 이미지, 다른 시각적 요소들이 포함된다
    8) JavaScript 실행 필요한 경우 Java Script 가 실행되어 동적인 기능을 추가하거나 페이지를 변경한다
    9) 로드완료 모든 요소와 스크립트가 로드되고 실행되면 페이지 로딩이 완료 되며 사용자는 페이지와 상호 작용할 수 있다

  6. 쿠키, 세션의 개념과 차이를 설명해보세요
    - 나의 답변 : 
    쿠키는 사용자가 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다. HTTP에서 클라이언트의 상태정보를 클라이언트의 PC에 저장했다가 필요시 정보를 참조하거나 재사용할 수 있다.
    쿠키의 특징은 1) 이름, 값, 저장기간, 경로 정보로 구성되어 있고 2) 클라이언트에 총 300개의 쿠키를 저장할 수 있다. 3) 하나의 도메인 당 20개의 쿠키를 가질 수 있다. 4) 하나의 쿠키는 4KB까지 저장이 가능하다.
    동작 방식은 클라이언트가 페이지를 요청 → 웹 서버에서 쿠키 생성 → 쿠키에 정보를 담아 HTTP 화면을 클라이언트에 보낼때 같이 보낸다 → 쿠키를 클라이언트가 가지고 있다가 서버에 다시 요청을 보낼 때 쿠키와 함께 요청을 전송한다 → 동일한 사이트를 재방문 하게 되면 클라이언트 PC에 해당 쿠키가 존재하면 요청 페이지와 함께 쿠키를 전송한다.

    세션은 일정 시간 동안 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시키는 기술인데 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라 한다.
    세션의 특징은 1) 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장하고 2) 이때 저장되는 쿠키가 세션 쿠키가 된다. 3) 브라우저를 닫거나 서버에서 세션을 삭제했을 때만 삭제 되므로 쿠키보다는 비교적 보안이 좋다고 할 수 있다. 4) 서버 용량이 허용하는 한에서 저장 데이터에 제한이 없다. 5) 각 클라이언트에 고유 세션 ID를 부여하는데 ID로 클라이언트를 구분해서 각 요구에 맞는 서비스를 보낸다
    동작 방식은 1) 클라이언트가 페이지에 요청을 보내고 → 2) 서버는 접근한 클라이언트의 Request-Header 에서 쿠키를 확인해서 클라이언트가 해당 세션 ID를 보냈는지 확인한다. → 3) ID가 존재하지 않으면 서버는 세션 ID를 생성해서 클라이언트에게 넘겨주고 → 4) 클라이언트는 그 ID를 쿠키에 저장한다. → 5) 클라이언트는 서버에 요청시 이 쿠키의 세션ID 값을 같이 전달하고 → 6) 서버는 전달받은 세션 ID로 세션에 있는 클라이언트 정보를 가지고 요청을 처리한 다음 응답한다.

    쿠키와 세션은 비슷한 역할을 하고 동작원리도 비슷하지만 큰 차이점은 사용자의 정보가 저장되는 위치다. 쿠키는 서버의 자원을 사용하지 않고 세션은 서버의 자원을 사용한다. 보안면에서도 세션이 더 우수하다. 그 이유는 쿠키는 클라이언트의 로컬에 저장이 되서 변질되거나 혹은 Request에서 스니핑 당할 우려가 있지만 세션은 쿠키를 이용해서 세션 ID만 저장하고 그것으로 구분해서 서버에서 처리하기 때문에 비교적 보안성이 높다.
    또한 라이플 사이클은 세션과 쿠키 모두 만료기간이 있지만 쿠키는 파일로 저장이 되기 때문에 브라우저를 종료해도 정보가 유지될 수 있고 만료기간을 따로 지정해서 쿠키를 삭제할 때 가지 유지할 수도 있다. 세션은 만료기간이 있어도 브라우저가 종료되면 만료기간에 상관없이 삭제 된다.
    속도는 쿠키는 쿠키에 정보가 있어서 서버에 요청시 속도가 더 빠르고 세션은 정보가 서버에 있어서 처리가 요구되기 때문에 속도가 느리다.

    참고한 사이트 : https://dev-coco.tistory.com/61,


    -모범 답안 : 
    1. **저장 위치**: 쿠키는 사용자의 브라우저에, 세션은 서버에 저장됩니다
    .2. **보안성**: 세션은 서버에 저장되므로 쿠키보다 상대적으로 보안성이 높습니다.
    3. **저장 용량**: 쿠키는 저장 용량에 제한이 있지만, 세션은 서버의 용량에 따라 다릅니다.
    4. **생명 주기**: 쿠키는 설정된 만료 시간까지 유지되지만, 세션은 일정 시간 활동이 없으면 만료됩니다.
    간단히 말하면, 쿠키는 사용자의 브라우저에 저장되는 작은 정보 조각이며, 세션은 서버에서 사용자 정보를 관리하기 위한 방법입니다.
    세션은 사용자의 정보를 지속적으로 받고 유지하기 위해서 세션을 사용합니다. 그런데 이러한 서버의 운용은 계속해서 사용자의 정보를 받아야하므로 부하가 발생할 수 있습니다.
    그래서 유저에 대한 정보를 쿠키에 저장해서 해당 쿠키에 대한 유효성만 검증을 하게끔 stateless 한 방식을 써서 서버의 부하를 줄일 수 있습니다.


  7. TCP/UDP에 대해서 설명해주세요.
    - 나의 답변 : 
    TCP는 전송을 제어하는 프로토콜이라는 뜻인데 데이터를 메세지이 형태로 보내기 위해서 IP 와 함께 사용한다.
    여기서 IP는 데이터의 배달을 처리하고 TCP는 패킷을 추적 및 관리를 하게 된다. 패킷은 인터넷 내에서 데이터를 보내기 위한 경로배정을 효율적으로 하기 위해서 데이터를 여러조각으로 전송을 하는데 이 조각을 패킷이라 한다. TCP는 연결형 서비스를 지원하는 프로토콜로 인터넷환경에서 기본적으로 사용한다.
    TCP의 특징은 연결 지향 방식으로 패킷 교환 방식을 사용하며 3 - way handshaking 과정 즉, 목적지와 수신지를 확실히 해서 정확한 전송을 보장하기 위해 세션을 수립하는 과정을 통해 연결을 설정하고 4 - way hanshaking을 통해 헤제한다. 흐름제어와 혼잡제어가 가능하며 높은 신뢰성을 보장한다. 다만 UDP보다 속도가 느린데 이유는 앞서 말한 특징 때문이고 그 특징들은 CPU를 사용하기 때문에 속도에 영향을 주게 된다. 따라서 TCP는 연속성보다는 신뢰성있는 전송이 중요할 때 사용하는 프로토콜이다. ex) 파일 전송
    TCP 서버의 특징은 서버와 클라이언트는 1 : 1로 연결되고 스트림 전송으로 전송 데이터의 크기가 무제한이다. 또한 패킷에 대한 응답을 해야하기에 성능이 낮다(CPU 소모, 시간 지연). 

    UDP는 사용자 데이터그램 프로토콜인데 데이터를 데이터그램 단위로 처리하는 프로토콜이다. 데이터그램은 독립적인 관계를 지닌 패킷이라는 뜻인데 동작방식은 다음과 같다.
    UDP는 TCP와는 다르게 비 연결형 프로토콜이고 연결을 위해 할당되는 논리적인 경로가 없다. 그래서 패킷은 각각 다른 경로로 전송이 되고 각각의 패킷은 독립적인 관계를 지니게 되고 다른경로로 독립적으로 처리된다.
    정리하자면 UDP의 특징은 비연결형 서비스로 데이터그램 방식을 제공하고 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다. 즉 연결을 설정하고 해제하는 과정이 존재하지 않고 서로 다른 경로로 독립적으로 처리함에도 패킷에 순서를 부여하여 재조립 하거나 흐름제어 또는 혼잡제어와 같은 기능도 처리하지 않아서 TCP보다 속도가 빠르고 네트워크 부하가 적다. 하지만 신뢰성있는 데이터의 전송을 보장하지 못한다. 그래서 신뢰성 보다는 연속성이 중요한 서비스에 적합하다. ex) 실시간 서비스 - 스트리밍
    UDP 서버의 특징은 IP 기반으로 데이터를 전송하고 서버와 클라이언트는 1 : 1, 1 : N, N : M등으로 연결될 수 있다. 데이터그램 단위로 전송이 될때 65535 바이트 크기로 전송 되는데 초과하면 잘라서 보내게 된다. 그리고 신뢰성이 필요한 서비스 보다는 성능이 중요시 되는 경우에 사용된다.

    연결 방식 - TCP = 연결형 서비스 / UDP = 비 연결형 서비스
    전송 순서 - TCP = 전송 순서 보장 / UDP = 전송 순서가 바뀔 수 있음
    수신 여부 확인 - TCP = 수신 여부 확인 / UDP = 수신 여부 확인 안함
    통신 방식 - TCP = 1 : 1 / UDP =  1 : 1, 1 : N, N : M 등
    신뢰성 - TCP = 높다 / UDP = 낮다
    속도 - TCP = 느리다 / UCP = 높다



    참고한 사이트 : https://mangkyu.tistory.com/15,


    -모범 답안 : 
    ### **TCP (Transmission Control Protocol):**
    1. **연결 지향적**: 데이터 전송 전에 먼저 연결을 설정하고, 데이터 전송 후 연결을 종료합니다.
    2. **신뢰성**: 데이터가 정확하게, 순서대로 도착하는 것을 보장합니다. 데이터가 손실되거나 순서가 바뀌면 재전송을 요청합니다.
    3. **흐름 제어**: 수신자와 송신자 사이의 데이터 전송 속도를 조절하여 네트워크의 혼잡을 방지합니다.
    4. **혼잡 제어**: 네트워크의 혼잡 상태를 감지하고, 혼잡을 피하기 위해 데이터 전송 속도를 조절합니다.

    ### **UDP (User Datagram Protocol):**
    1. **연결 없음**: 데이터를 전송하기 전에 별도의 연결 설정 없이 바로 데이터를 전송합니다.
    2. **신뢰성 없음**: 데이터의 도착을 보장하지 않습니다. 데이터가 손실되거나 순서가 바뀌어도 재전송을 요청하지 않습니다.
    3. **속도**: TCP보다 빠른 전송 속도를 가질 수 있습니다. (재전송 과정이 없기 때문)
    4. **헤더 크기**: UDP의 헤더 크기가 TCP보다 작아 부하가 적습니다.

    ### **차이점:**-
    **신뢰성**: TCP는 신뢰성 있는 데이터 전송을 보장하지만, UDP는 그렇지 않습니다.-
    **속도**: UDP는 연결 설정과 재전송 과정이 없기 때문에 TCP보다 빠를 수 있습니다.-
    **사용 용도**: TCP는 웹 브라우징, 이메일, 파일 전송 등에 사용되며, UDP는 스트리밍, 온라인 게임, VoIP 등에 사용됩니다.간단히 말하면, TCP는 신뢰성 있는 데이터 전송을 위한 프로토콜이며, UDP는 빠른 데이터 전송을 위한 프로토콜입니다.

  8. http, https 차이점에 대해 설명해주세요
    - 나의 답변 : 
    1. 보안의 차이
    - http는 데이터를 암호화하지 않고 평문으로 전송하는데 이렇게 되면 데이터를 노출시키고 중간에서 데이터를 감청 혹은 수정 할 수 있다. 그래서 민감한 정보를 전송할 때에 보안이 문제가 생긴다. 
    - https는 SSL(보안 소켓 레이어) 또는 TLS(전송 계층 보안) 프로토콜을 사용해서 데이터를 암호화하고 안전하게 전송한다. 그래서 중간에서 데이터를 보호하고 데이터의 무결성을 보장하고 브라우저와 서버간의 통신을 안전하게 만들어 준다.

    2. 데이터 무결성 차이
    - http는 데이터의 무결성을 검증하지 않으므로 데이터가 전송중에 손실 될 수 있다.
    - https는 전송하는 데이터의 무결성을 검증하여 중간에서 데이터가 변경되지 않도록 보장한다.

    3. 인증의 차이
    - http는 웹 사이트의 신원을 확인하지 않아서 사이트를 신뢰할 수 있는지 확신할 수 없다.
    - https는 SSL/TLS 인증서를 사용하는데 이걸로 사이트의 신원을 확인한다. 그래서 신뢰할 수 있는 사이트와 통신할 수 있다.


    참고한 사이트 : 


    -모범 답안 : 
    HTTP(HTTP - Hypertext Transfer Protocol)와 HTTPS(HTTPS - Hypertext Transfer Protocol Secure)는 월드 와이드 웹(웹)에서 데이터를 전송하는 프로토콜입니다. 이 둘의 주요 차이점은 보안과 데이터 암호화에 관련이 있습니다.

    **HTTP (Hypertext Transfer Protocol):**
    1. **보안**: HTTP는 데이터 전송을 암호화하지 않기 때문에 보안 문제가 있습니다. 데이터는 평문(암호화되지 않은 텍스트)으로 전송되며, 중간자 공격 및 데이터 가로채기와 같은 위협에 노출될 수 있습니다.
    2. **포트**: HTTP는 기본적으로 80번 포트를 사용합니다.

    **HTTPS (Hypertext Transfer Protocol Secure):**
    1. **보안**: HTTPS는 HTTP의 보안 버전입니다. 데이터를 암호화하여 보호합니다. 이를 위해 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 프로토콜을 사용하여 데이터를 암호화하고 안전하게 전송합니다. 따라서 데이터의 기밀성과 무결성을 제공하며 중간자 공격을 예방합니다.
    2. **포트**: HTTPS는 기본적으로 443번 포트를 사용합니다
    .**HTTPS 사용 사례 및 이점:**-
    **인증**: HTTPS는 웹 사이트가 신뢰할 수 있는 것임을 인증기관(Certificate Authority)을 통해 증명합니다. 이는 사용자가 웹 사이트의 신원을 확인할 수 있고, 데이터를 제대로 암호화했음을 확인하는 데 도움이 됩니다.-
    **데이터 보안**: HTTPS를 사용하면 중요한 정보(예: 로그인 정보, 신용 카드 번호)를 전송할 때 더 높은 보안 수준을 제공합니다.-
    **검색 엔진 순위**: 검색 엔진은 HTTPS를 사용하는 웹 사이트를 더 높은 순위로 보는 경향이 있습니다. 따라서 HTTPS를 사용하면 SEO(검색 엔진 최적화)에 도움이 될 수 있습니다.-
    **브라우저 호환성**: 브라우저들은 HTTPS를 적극적으로 지원하며, 사용자에게 안전한 웹 사이트를 나타내는 데 도움을 줍니다.요약하면, HTTPS는 HTTP에 비해 높은 보안 수준을 제공하며, 중요한 정보를 안전하게 전송하는 데 사용됩니다. 많은 웹 사이트 및 웹 애플리케이션이 HTTPS를 통해 보안을 강화하고 사용자 데이터를 보호하고 있습니다.

  9. DI, IoC에 대해 설명해주세요.
    - 나의 답변 : 
    DI(Dependency Injection)와 IoC(Inversion of Control)는 소프트웨어 개발에서 코드의 관리 및 유지보수를 용이하게 하기 위한 개념이다 

    1. **DI (Dependency Injection - 의존성 주입)**:
       - DI는 의존성 관리를 위한 디자인 패턴 중 하나로 의존성은 객체가 다른 객체에 의존하는 것을 나타낸다.
       - DI는 객체 간의 결합을 낮추기 위해 사용되고 한 객체가 다른 객체의 생성이나 동작에 대한 제어를 가지지 않도록 한다.
       - DI는 주로 생성자 주입, 메서드 주입, 속성 주입 등의 방식을 사용하여 의존 객체를 제공하는데, 이를 통해 코드의 테스트 용이성, 재사용성, 유지보수성을 향상시킬 수 있다.

    2. **IoC (Inversion of Control - 제어의 역전)**:
       - IoC는 객체 생성과 관리의 제어를 개발자에서 컨테이너나 프레임워크로 넘기는 것을 말한다. 기존에는 개발자가 직접 객체를 생성하고 제어했지만, IoC는 이러한 제어를 역전시킨다.
       - IoC 컨테이너나 프레임워크는 객체의 라이프사이클을 관리하고 객체들 간의 의존성을 해결해준다. 이를 통해 코드의 결합도를 낮추고 유연성을 향상시킨다.
       - 대표적인 IoC 컨테이너로는 Spring, Java EE의 CDI(Container-Managed Beans), .NET의 ASP.NET Core Dependency Injection 등이 있다.


    참고한 사이트 : 


    -모범 답안 : 
  10. 객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?
    - 나의 답변 : 
    객체지향 프로그래밍(OOP, Object-Oriented Programming)은 컴퓨터 프로그래밍 패러다임 중 하나로, 현실 세계의 객체와 그 객체들 간의 상호작용을 모델링하는 개념에 기반한다.

    1. 클래스(Class) - 클래스는 객체를 생성하기 위한 템플릿이며, 객체의 구조와 동작을 정의힌다. 예를 들어, 자동차 클래스는 자동차 객체를 만들 때 필요한 속성(색상, 모델 등)과 메서드(주행, 정지 등)를 정의한다.

    2. 객체(Object) - 클래스의 인스턴스를 의미하며, 실제 데이터와 메서드를 포함한다. 자동차 클래스의 객체는 실제 자동차를 나타낸다.

    3. 상속(Inheritance) - 상속은 클래스 간의 관계를 나타내며, 부모 클래스(슈퍼 클래스)와 자식 클래스(서브 클래스) 간의 관계를 형성한다. 자식 클래스는 부모 클래스의 속성과 메서드를 상속받을 수 있으며, 이를 통해 코드의 재사용과 계층적 구조를 지원하게 된다.

    4. 다형성(Polymorphism) - 다형성은 객체가 다양한 형태로 동작할 수 있는 능력을 나타내는데 다형성을 통해 같은 메서드 이름을 사용하여 여러 클래스의 객체를 다룰 수 있다. 이는 코드의 유연성을 향상시키고 확장성을 제공한다.

    5. 캡슐화(Encapsulation) - 캡슐화는 객체의 상태와 동작을 외부에서 직접 접근하는 것을 제한하는 것을 의미하는데 객체의 내부 상태는 private으로 설정되고, 외부에서는 메서드를 통해 상호작용한다. 이는 데이터 은닉과 보안을 지원한다.

    객체지향 프로그래밍의 활용은

    1. 모듈화(Modularity) - 클래스와 객체를 사용하여 코드를 모듈화하고, 각 모듈을 독립적으로 개발 및 테스트할 수 있다. 이는 코드의 이해와 유지보수를 단순화하게 해준다.

    2. 재사용(Reusability) - 클래스와 상속을 통해 코드를 재사용할 수 있다. 이미 구현된 클래스를 확장하거나 수정하지 않고도 새로운 기능을 추가할 수 있다.

    3. 유지보수(Maintenance) - 객체지향 코드는 변경 및 유지보수에 용이하다. 변경이 필요한 경우 해당 객체나 클래스만 수정하면 되며, 다른 부분에 영향을 미치지 않게 할 수 있다.

    4. 확장성(Scalability) - 객체지향 설계는 새로운 클래스와 객체를 추가하여 시스템을 확장하기 쉽게 만든다.

    5. 협업(Collaboration) - 객체지향 설계는 현실 세계의 개념을 모델링하므로 도메인 전문가와 개발자 간의 의사소통을 용이하게 한다.

    6. 안정성(Security) - 캡슐화와 다형성을 통해 코드의 안정성과 보안을 높일 수 있다.

    객체지향 프로그래밍은 다양한 프로그래밍 언어에서 지원되며, 대표적으로 Java, C++, Python, C#, Ruby 등이 있다. 이러한 언어를 사용하여 객체지향 원칙을 적용하여 소프트웨어를 개발할 수 있다.

    참고한 사이트 : 


    -모범 답안 :  내거

'스터디일지' 카테고리의 다른 글

코틀린이란?  (0) 2024.02.18
CS 면접 질문 대비 31번 ~ 40번  (0) 2023.11.17
CS 면접 질문 대비 11번 ~ 20번  (0) 2023.10.24
CS 면접 질문 대비 1번 ~ 10번  (1) 2023.10.11
Docker 사용해보기  (0) 2023.10.07