면접 (Java)/준비

[면접] 기초 면접 (25~30)

hihyuk 2024. 3. 29. 11:28

25. 쿠키, 세션의 개념과 차이를 설명해보세요

핵심 키워드 : 저장 위치, 데이터 유지, 보안

  "쿠키와 세션은 사용자의 상태 정보를 유지하는 데 사용되는 기술로, 웹 상에서 클라이언트와 서버 간의 상태를 유지하는 방법입니다. 그러나 저장 위치, 데이터 유지 방식, 보안 측면에서 차이가 있습니다.
쿠키(Cookie)는 클라이언트의 웹 브라우저에 텍스트 파일 형태로 저장되며, 사용자가 다시 해당 사이트를 방문할 때 브라우저를 통해 서버에 전송됩니다. 쿠키는 주로 사용자의 선호도, 로그인 상태 등을 저장하는 데 사용되며, 클라이언트 측에서 생성, 저장, 수정할 수 있습니다. 쿠키의 데이터 유지 기간은 개발자가 설정할 수 있으나, 보안이 상대적으로 약하고 사용자의 PC에 직접 저장되기 때문에 민감한 정보 저장에는 적합하지 않습니다.
세션(Session)은 서버 측에서 관리되며, 클라이언트에게는 고유 세션 ID를 할당하여 이를 쿠키(세션 쿠키)나 URL 파라미터로 사용해서 세션을 구별합니다. 서버는 이 세션 ID를 통해 사용자의 상태 정보를 세션에 저장하고 관리합니다. 세션은 사용자가 브라우저를 닫거나 로그아웃할 때까지 유지되며, 보안성이 더 높지만 서버의 자원을 사용하기 때문에 많은 양의 데이터를 저장하거나 많은 사용자를 처리할 때 부하가 될 수 있습니다.
결론적으로, 쿠키는 클라이언트 측에서 간단한 데이터를 지속적으로 유지할 때 유용하며, 세션은 사용자 인증 정보 같은 민감하고 일시적인 데이터를 보다 안전하게 서버 측에서 관리할 때 적합합니다."

 

꼬리 질문 > 세션 관리에 있어서 세션 하이재킹(Session Hijacking) 공격을 방지하기 위한 방법은 무엇인가요?

  "세션 하이재킹은 공격자가 사용자의 세션 ID를 탈취하여 그 사용자로서 시스템에 접근하는 보안 위협입니다. 이를 방지하기 위한 방법으로는 여러가지가 있습니다.

첫째, 모든 통신을 암호화하는 HTTPS를 사용하여, 세션 ID가 전송 과정에서 탈취되는 것을 방지합니다. 

둘째, 로그인 후 또는 일정 시간마다 세션 ID를 새로운 것으로 갱신하여, 공격자가 오래된 ID를 사용하는 것을 방지합니다.

셋째, 예측하기 어려운, 충분히 무작위적인 세션 ID를 생성하여 사용함으로써, 공격자가 세션 ID를 예측하는 것을 어렵게 합니다.

넷째, 쿠키에 HttpOnly와 Secure 속성을 설정하여, 자바스크립트를 통한 쿠키 접근을 막고, HTTPS 통신에서만 쿠키가 전송되도록 합니다.

마지막으로 일정 시간 동안 활동이 없는 세션은 자동으로 만료되도록 설정하여, 유효 기간이 지난 세션 ID의 사용을 방지합니다.

이러한 조치들을 통해 세션 하이재킹 공격의 위험을 크게 줄일 수 있으며, 사용자의 데이터 보호 및 시스템의 안전성을 강화할 수 있습니다.

26. TCP/UDP에 대해서 설명해주세요.

핵심 키워드 : 3 Way Handshake, 패킷, 프로토콜, OSI 7 Layer, 데이터 신뢰성, 무결성

  "TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)는 인터넷 상에서 데이터를 전송하기 위한 핵심 프로토콜입니다. 두 프로토콜은 OSI 7 Layer 모델의 전송 계층에 위치하며, 데이터의 신뢰성과 무결성 측면에서 서로 다른 특성을 가집니다.
TCP는 연결 지향적 프로토콜로, 데이터 전송 전에 '3 Way Handshake' 과정을 통해 두 단말 간의 연결을 확립합니다. 이 과정을 통해 데이터의 순서 보장, 중복 검사, 오류 검출 및 재전송 등을 처리하여 데이터의 신뢰성과 무결성을 보장합니다. TCP는 이메일, 웹 페이지 로딩 등 오류가 발생하면 안 되는 서비스에 주로 사용됩니다.
UDP는 비연결 지향적 프로토콜로, 연결 설정 없이 데이터를 패킷 단위로 바로 전송합니다. 이로 인해 TCP에 비해 빠른 전송 속도를 제공하지만, 데이터의 순서 보장이나 오류 복구 기능은 없어 신뢰성이 떨어집니다. UDP는 실시간 스트리밍, 온라인 게임 등 지연 시간이 중요한 애플리케이션에 적합합니다.
결론적으로, TCP는 데이터의 신뢰성과 무결성이 중요할 때 사용되며, UDP는 빠른 데이터 전송이 요구되지만 일부 데이터 손실이 허용되는 상황에 주로 사용됩니다."

 

꼬리 질문 > TCP의 '3 Way Handshake' 과정에서 네트워크 지연이 발생하면 어떤 영향을 미치며, 이를 최소화하기 위한 방법은 무엇인가요?

  "TCP의 '3 Way Handshake' 과정에서 네트워크 지연이 발생하면, 연결 설정 시간이 길어져 전체 데이터 전송 시간이 늘어날 수 있습니다. 이는 특히 실시간 통신이 중요한 애플리케이션에서 사용자 경험을 저하시킬 수 있습니다. 네트워크 지연을 최소화하기 위한 방법으로는 첫째, 네트워크 인프라의 품질 개선 및 최적화를 통해 전반적인 지연 시간을 줄이는 것입니다. 둘째, TCP Fast Open(TFO)과 같은 기술을 활용하여 '3 Way Handshake' 과정에서 데이터를 초기 전송 단계부터 시작할 수 있도록 함으로써 핸드셰이크 시간을 단축시키는 방법이 있습니다. 셋째, 가능하다면 지역적으로 가까운 서버를 사용하여 물리적 거리에 따른 지연을 최소화하는 것도 중요합니다. 이러한 방법을 통해 TCP 기반의 통신에서 네트워크 지연의 영향을 줄이고, 효율적인 데이터 전송을 도모할 수 있습니다."

 

27. http, https 차이점에 대해 설명해주세요

핵심 키워드 : SSL 인증, 인증서, 암호화와 복호화, 포트 번호

  "HTTP(HyperText Transfer Protocol)와 HTTPS(HyperText Transfer Protocol Secure)는 웹 상에서 데이터를 전송하는 프로토콜로, 주로 웹 브라우저와 서버 간의 통신에 사용됩니다. 주요 차이점은 데이터의 보안성에 있습니다.
HTTP는 데이터를 암호화하지 않고 평문으로 전송하기 때문에, 전송 중인 데이터가 제3자에 의해 도청되거나 변조될 위험이 있습니다. 반면, HTTPS는 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 프로토콜을 사용하여 데이터를 암호화하고, 서버와 클라이언트 간의 통신을 보호합니다. 이는 데이터의 기밀성과 무결성을 보장하며, 사용자의 정보가 안전하게 전송되도록 합니다.
HTTPS는 서버가 유효한 SSL 인증서를 가지고 있어야 하며, 이 인증서는 신뢰할 수 있는 인증 기관(CA)에 의해 발급됩니다. 이 과정을 통해 사용자는 웹사이트의 신뢰성을 확인할 수 있습니다. 또한, HTTP와 HTTPS는 각각 다른 포트 번호를 사용하는데, HTTP는 포트 80을, HTTPS는 포트 443을 기본으로 사용합니다.
결론적으로, HTTPS는 HTTP에 비해 보안성이 강화된 프로토콜이며, 개인 정보 보호와 온라인 거래의 안전성을 위해 널리 사용됩니다."

 

꼬리 질문 > HTTPS 연결 과정에서 SSL 인증서의 역할은 무엇이며, 어떻게 작동하는가요?

  "HTTPS 연결 과정에서 SSL 인증서는 서버의 신원을 클라이언트에게 검증하고, 서버와 클라이언트 간의 안전한 통신 채널을 구축하는 데 핵심적인 역할을 합니다. 사용자가 HTTPS를 통해 웹사이트에 접속하려 할 때, 서버는 자신의 SSL 인증서를 클라이언트에게 전송합니다. 이 인증서에는 서버의 공개 키, 인증서를 발급한 인증 기관(CA)의 정보, 서버의 도메인 이름 등이 포함되어 있습니다.

클라이언트는 받은 인증서가 신뢰할 수 있는 CA에 의해 발급되었는지 확인하고, 인증서가 유효한지 검증합니다. 이 과정을 통해 클라이언트는 접속하려는 서버의 신원을 확인할 수 있습니다. 신원이 검증되면, 클라이언트와 서버는 인증서에 포함된 서버의 공개 키를 사용하여 통신에 사용될 임시 세션 키를 암호화하여 교환합니다. 이후 통신은 이 세션 키를 사용하여 암호화되어 진행되며, 이를 통해 데이터의 기밀성과 무결성이 보장됩니다.

결론적으로, SSL 인증서는 HTTPS 연결 과정에서 서버의 신원을 검증하고 안전한 데이터 교환을 가능하게 하는 데 필수적인 요소입니다."

 

28. 객체 지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

핵심 키워드 : 절차 지향과 객체 지향, 클래스, 캡슐화, 상속, 유지 보수

  "객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체들의 모임으로 파악하고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 패러다임입니다. 이는 절차 지향 프로그래밍과 대비되며, 데이터 모델링을 통해 현실 세계의 사물을 클래스와 객체로 표현합니다.
객체 지향 프로그래밍의 핵심 개념에는 캡슐화, 상속, 그리고 다형성이 있습니다. 캡슐화는 객체의 데이터와 메소드를 결합하고, 외부로부터의 접근을 제한하여 데이터의 보호와 은닉을 가능하게 합니다. 상속은 한 클래스가 다른 클래스의 속성과 메소드를 물려받을 수 있게 하여, 코드의 재사용성을 높이고 유지 보수를 용이하게 합니다. 다형성은 동일한 인터페이스나 메소드 호출에 대해 다양한 방식으로 응답할 수 있도록 함으로써, 코드의 유연성을 향상시킵니다.
객체 지향 프로그래밍은 소프트웨어의 설계와 개발 과정에서 모듈성, 재사용성, 확장성, 그리고 유지 보수성을 증가시키는 데 크게 기여합니다. 이러한 특성은 대규모 소프트웨어 개발 프로젝트에서 특히 유용하며, 코드의 중복을 줄이고, 시스템의 다양한 부분을 독립적으로 개발 및 테스트할 수 있게 해줍니다. 따라서, 객체 지향 프로그래밍은 복잡한 시스템을 효과적으로 관리하고, 개발 프로세스를 개선하는 데 핵심적인 역할을 합니다."

 

29. 프로세스와 쓰레드의 차이점에 대해 설명해주세요.

핵심 키워드 : 메모리, 인스턴스, 할당, 영역

  "프로세스와 쓰레드는 운영 체제에서 실행되는 작업 단위입니다만, 메모리 관리와 실행 방식에서 중요한 차이점을 가집니다.
프로세스는 실행 중인 프로그램의 인스턴스로, 독립된 메모리 영역(코드, 데이터, 힙, 스택 등)을 할당받습니다. 각 프로세스는 완전히 독립적으로 실행되며, 다른 프로세스의 메모리에 직접 접근할 수 없습니다. 이는 프로세스 간의 데이터 공유를 보호하며, 안정적인 시스템 운영을 지원합니다.
반면, 쓰레드는 프로세스 내에서 실행되는 경량화된 실행 단위로, 프로세스가 할당받은 메모리를 공유합니다. 쓰레드는 같은 프로세스 내의 다른 쓰레드와 코드, 데이터, 힙 영역을 공유하며, 각자의 스택을 가지고 실행됩니다. 이로 인해 쓰레드 간의 데이터 공유와 통신이 용이하지만, 동시성 관리가 필요합니다.
결론적으로, 프로세스는 메모리와 자원을 독립적으로 할당받아 실행되는 반면, 쓰레드는 프로세스의 자원을 공유하며 실행되어 자원 사용의 효율성을 높이고, 커뮤니케이션 비용을 줄일 수 있습니다."

 

꼬리 질문 > 객체 지향 프로그래밍에서 인터페이스와 추상 클래스의 차이점은 무엇이며, 각각 어떤 상황에서 사용하는 것이 좋나요?

  "인터페이스와 추상 클래스는 객체 지향 프로그래밍에서 중요한 개념으로, 코드의 재사용성과 유연성을 높이는 데 사용됩니다. 둘의 주요 차이점은 추상 클래스가 클래스의 일부 구현을 포함할 수 있으나, 인터페이스는 모든 메서드가 기본적으로 추상 메서드이며 구현을 포함할 수 없다는 점입니다.

인터페이스는 구현할 메서드의 시그니처만 정의하며, 다중 상속의 이점을 제공합니다. 인터페이스는 다양한 클래스가 동일한 인터페이스를 구현할 수 있으므로, 다형성을 지원하고 코드의 유연성을 높이는 데 유용합니다. 특정 동작의 규약을 여러 클래스에 적용하고 싶을 때 주로 사용됩니다.

추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있으며, 일부 공통 구현을 제공할 수 있습니다. 추상 클래스는 상속을 통해 자식 클래스에게 특정 메서드나 변수를 상속할 수 있으며, 코드 재사용성을 높이는 데 효과적입니다. 공통된 기본 동작이나 상태를 가진 클래스를 만들고자 할 때 사용됩니다.

결론적으로, 인터페이스는 다양한 클래스가 동일한 동작을 수행해야 하며, 서로 다른 클래스 사이의 계약을 정의할 때 사용하는 것이 좋습니다. 반면, 추상 클래스는 여러 클래스에 걸쳐 공통된 코드를 공유하거나, 일부 기능의 구현을 강제하면서도 공통의 기본 동작이나 상태를 제공하고자 할 때 유리합니다."

 

30. 데이터정규화에 대해 설명해주세요

핵심 키워드 : 무결성, 일관성, 정규 형태, 종속성

  "데이터 정규화는 데이터베이스의 설계를 최적화하는 과정으로, 데이터의 중복을 최소화하고, 무결성과 일관성을 보장하기 위해 구조를 조정하는 방법입니다. 정규화 과정은 여러 단계의 '정규 형태'(Normal Forms)로 구성되며, 각 단계는 특정한 규칙을 만족해야 합니다.
1차 정규형(1NF)은 모든 필드의 값이 원자적이어야 하며, 중복된 열이 없어야 합니다. 2차 정규형(2NF)은 1NF를 만족하고, 모든 비주요 필드가 기본 키에 완전히 함수적으로 종속되어야 합니다. 3차 정규형(3NF)은 2NF를 만족하며, 비주요 필드가 기본 키에만 종속되고, 이행적 종속이 없어야 합니다.
정규화는 데이터베이스에서 데이터의 중복을 제거하고, 업데이트, 삽입, 삭제 시 발생할 수 있는 이상 현상을 방지합니다. 이를 통해 데이터의 무결성과 일관성을 유지할 수 있으며, 유지 보수와 확장성이 향상됩니다. 하지만, 과도한 정규화는 쿼리의 복잡성을 증가시킬 수 있으므로, 성능과의 균형을 고려한 적절한 정규화 수준이 필요합니다."

 

꼬리 질문 > 정규화 과정에서 발생할 수 있는 '과도한 정규화'의 부정적인 영향은 무엇이며, 이를 어떻게 해결할 수 있나요?

  "과도한 정규화는 데이터베이스 설계를 너무 세분화하여, 데이터를 여러 테이블에 분산시키는 것을 말합니다. 이로 인해 발생하는 부정적인 영향으로는 쿼리 실행 시 여러 테이블을 조인해야 하므로 쿼리의 복잡성이 증가하고, 데이터 검색에 더 많은 시간이 소요되어 성능이 저하될 수 있습니다. 또한, 데이터의 삽입, 업데이트, 삭제 작업이 더 복잡해지고 오류가 발생할 확률이 높아질 수 있습니다.

과도한 정규화의 문제를 해결하기 위해서는 '반정규화'(Denormalization) 과정을 고려할 수 있습니다. 반정규화는 정규화된 구조를 일부러 다시 합치는 과정으로, 쿼리의 성능을 향상시키고, 애플리케이션의 복잡성을 줄이기 위해 사용됩니다. 이 과정에서는 자주 함께 사용되는 데이터를 하나의 테이블에 저장하거나, 계산된 값을 저장하는 등의 방법을 사용하여 데이터 접근 시간을 줄일 수 있습니다.

결론적으로, 데이터베이스의 성능과 유지 보수성 사이에서 적절한 균형을 찾는 것이 중요하며, 이를 위해 필요에 따라 적절한 수준에서 정규화와 반정규화를 적용해야 합니다. 데이터베이스의 사용 패턴과 애플리케이션의 요구 사항을 충분히 분석한 후, 성능 향상을 위해 필요한 경우에만 반정규화를 고려하는 것이 바람직합니다."