랑아
article thumbnail

Java

Java의 특징을 설명해주세요.

Java는 객체 객체지향 프로그래밍 언어입니다.

기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다.

Java의 장점은 JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적이며, GarbageCollector를 통한 자동적인 메모리 관리가 가능하다는 것입니다.

Java의 단점은 JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리고, 다중 상속이나 타입에 엄격하며, 제약이 많다는 것입니다.


JVM의 역할에 대해 설명해주세요.

자바 가상 머신(Java Virtual Machine)의 약자를 따서 줄여 부르는 용어로 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것입니다. JVM은 메모리 관리(GC)를 수행하며 스택 기반의 가상머신 입니다.


JVM의 구조에 대해 설명해주세요.

JVM의 구조는 Class Loader, Execution Engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있습니다.

클래스 로더는 JVM 내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다.

실행 엔진(Execution Engine)은 바이트 코드를 실행시키는 역할을 합니다. 실행 엔진의 구성 요소로는 인터프리터, JIT 컴파일러, GC가 있습니다.
인터프리터는 바이트 코드를 한 줄 씩 실행합니다.
JIT 컴파일러는 인터프리터의 효율을 높이기 위한 컴파일러로 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러가 반복되는 코드를 네이티브 코드로 변환합니다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용합니다.
가비지 컬렉터(GC)는 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미합니다.

Runtime Data Area는 프로그램 실행 중에 사용되는 다양한 영역으로 PC Register, Stack Area, Heap Area, Method Area, Native Method Area로 크게 5가지 영역으로 구분되어 있습니다.

JNI(Java Native Interface)는 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 잇는 방법을 제공해줍니다. Native 키워드를 사용하여 메소드를 호출하며, 대표적인 메서드는 Thread의 currentThread()입니다.

Native Method Library는 C, C++로 작성된 라이브러리입니다.


Java의 실행 방식에 대해 설명해주세요.

자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시키고, 클래스 로더를 통해 class 파일들을 JVM으로 로딩합니다.

로딩된 class파일들은 Execution engine을 통해 해석되며, 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어집니다.


Java에서 제공하는 원시 타입들이 무엇이 있으며, 각각 몇 바이트를 차지하는지 설명해주세요.

정수형에서 byte는 1바이트, short은 2바이트, int는 4바이트, long은 8바이트를 차지합니다.

실수형에서 float은 4 바이트, double은 8 바이트를 차지하고, 문자형 char는 2바이트, 논리형 boolean은 1바이트를 차지합니다.


GC(가비지 컬렉터)가 무엇인지, 필요한 이유는 무엇인지 설명해주세요

GC는 힙 영역에서 사용하지 않는 객체들을 제거하는 작업을 의미합니다.

객체를 제거하는 작업이 필요한 이유는 자바는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문입니다. 따라서 객체를 사용하고 제거하는 기능이 필요하게 됩니다.


GC(가비지 컬렉터)의 동작 방식에 대해 설명해주세요

GC는 Minor GC와 Major GC로 구분할 수 있으며, Minor GC는 young 영역에서, Major GC는 old 영역에서 일어난다고 정의합니다.

GC를 수행할 때는 GC를 수행하는 스레드 이외의 스레드는 모두 정지하며, 이를 Stop-the-world라고 합니다.

Minor GC는 Eden 영역이 가득 차면 시작됩니다. Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사합니다. 그리고 Eden 영역을 비웁니다. survivor 영역도 가득차면 같은 방식으로 다른 survivor 영역에 복사하고 비웁니다. 이를 반복하다 보면 계속 해서 살아남은 객체는 old 영역으로 이동하게 됩니다.

Major GC는 old영역에서 일어납니다. 삭제되어야 하는 객체를 mark하고 지웁니다.(sweep) 메모리는 단편화 된 상태이므로 이를 한 군데에 모아주는 것은 Compaction이라 하며 compact라고 합니다. 그래서 Mark-Sweep-Compact 알고리즘이라고 합니다.


Java의 메모리 영역에 대해 설명해주세요.

자바의 메모리 영역은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다.

메서드(Method) 영역은 전역 변수와 static 변수를 저장하며, 프로그램의 시작부터 종료까지 메모리에 남아있습니다.

스택(Stack) 영역은 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메서드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제됩니다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워집니다.

힙(Heap) 영역은 new 키워드로 생성되는 객체(인스턴스), 배열 등이 저장되며, 가비지 컬렉션에 의해 메모리가 관리됩니다.


Java의 메모리 영역이 할당되는 시점이 언제인지 설명해주세요.

메서드(Method) 영역은 JVM이 동작해서 클래스가 로딩될 때 생성됩니다.

스택(Stack) 영역은 컬파일 타입 시 할당되며, 힙(Heap) 영역은 런타임시 할당됩니다.


클래스와 객체에 대해 설명해주세요.

클래스는 객체를 정의하는 틀 또는 설계도라고 할 수 있습니다.

객체는 클래스에 정의된 내용대로 메모리에 생성된 개체로 고유 이름, 행동, 상태를 가지며, 상태는 필드, 행동은 메서드라고 표현합니다.

그리고 객체에 메모리가 할당되어 실제로 활용 가능한 실체를 '인스턴스'라고 부릅니다.


생성자에 대해 설명해주세요.

생성자는 클래스와 같은 이름의 메서드로 객체가 생성될 때 호출되는 메서드입니다.

명시적으로 생성자를 만들지 않아도 default 생성자가 생성되며, 생성자는 파라미터를 다르게 하여 오버로딩할 수 있습니다.


원시타입과 참조 타입의 차이에 대해 설명해주세요.

원시타입은 Java에서 8개 밖에 존재하지 않는 타입입니다. 나머지는 모두 참조타입이라고 볼 수 있고, Object 클래스이거나 이를 상속하는 클래스들로 이루어져 있습니다.

원시타입은 항상 값이 존재해야 하지만, Object 타입은 null 포인터를 가질 수 있습니다. 그리고 멤버 변수가 초기화될 때, 원시타입은 기본값을 가지지만, 참조타입은 null 포인터를 가지고 있습니다.


static에 대해 설명해주세요.

static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 떄 클래스별로 관리됩니다.

static 키워드를 사용한 변수나 메서드, 즉 정적 멤버들은 모든 객체가 메모리를 공유하며, 어디서든지 참조할 수 있다는 장점이 있습니다.

그러나 GC의 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리가 할당된 채로 존재하게 되어 시스템 성능에 악영향을 줄 수 있습니다.


static을 사용하는 이유에 대해 설명해주세요.

static은 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터인 공용자원을 관리할 때 사용합니다.

일종의 전역변수와 같은 개념으로 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽지 않아 비용을 줄이고 효율을 높일 수 있습니다.


접근제어자에 대해 설명해주세요.

접근제어자는 변수 또는 메서드의 접근 범위를 설정하기 위해 사용하는 Java의 예약어를 의미하며, private, default, protected, public으로 총 4가지가 있습니다.

private은 해당 클래스 내에서만, default는 해당 패키지 내에서만, protected는 상속한 클래스까지, public은 전체 영역에서 접근 가능합니다.


오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 설명해주세요.

오버라이딩은 상위 클래스에 있는 메서드를 하위 클래스에서 재정의하는 것을 의미합니다.

오버로딩은 같은 클래스 내에서 매개변수의 개수나 타입을 다르게 구현하여 같은 이름의 메서드를 여러 개 정의하는 것입니다.


추상 클래스와 인터페이스에 대해 설명해주세요.

추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용하며, 클래스 내에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.

인터페이스는 모든 메서드가 추상 메서드로만 이루어져 있으며, 구현 객체가 동일하게 동작하는 것을 보장하기 위해 사용합니다.

공통점으로 new 연산자로 인스턴스 생성이 불가능하며, 사용하기 위해서는 하위 클래스에서 확장 및 구현해야 한다는 것이 있습니다.

차이점으로 추상 클래스는 단일 상속만 가능하고, 인터페이스는 다중 상속이 가능합니다. 그리고 추상클래스를 상속하는 집합 간에는 연관 관계가 있으며, 인터페이스를 구현한 집합 간에는 연관 관계가 없을 수 있습니다.


객체지향에 대해 설명해주세요.

객체지향은 의존성 관리라고 정의할 수 있습니다.

객체지향으로 의존성을 관리함으로써 변경 영향을 최소화하고 독립적인 배포가 가능해지며 독립적인 개발이 가능해집니다.

따라서 객체지향에서 가장 중요한 것은 DIP(Dependency Inversion Principle)를 통한 고수준 정책(High Level Policy)과 저수준 구현 세부사항(Low Level Details)의 분리라고 할 수 있습니다.


강한 결합과 느슨한 결합에 대해 설명해주세요.

결합도는 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 정보를 알고 있는지에 대한 척도입니다.

어떤 모듈이 다른 모듈에 대해 자세한 부분(구현 세부사항)까지 알고 있을 경우에 강한 결합도를 가진다고 합니다.

그리고 어떤 모듈이 다른 모듈에 대해 필요한 정보(인터페이스로 추상화된 고수준 정책)만 알고 있다면 두 모듈은 낮은 결합도를 가진다고 합니다.

객체지향 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타냅니다. 이런 관점에서 강한 결합도는 반드시 지양해야 하며, 개발자는 적절한 결합도를 유지할 수 있도록 고민하고 설계해야 합니다.


CheckedException과 UnCheckedException의 차이에 대해 설명해주세요.

둘의 차이는 RuntimeException을 상속하는가의 여부에 따라 다릅니다.

RuntimeException을 상속하면 UnCheckedException이며, 그 외의 Exception은 CheckedException입니다.

CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다.

UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다.


동일성(identity)과 동등성(equality)에 대해 설명해주세요.

동일성은 객체의 주소가 같은지 비교하는 것이고, 두 객체가 같은 주소를 가지고 있다면 동일하다고 할 수 있습니다.

동등성은 두 객체가 같은 정보를 가진 것인지 비교하는 것으로 변수가 참조하고 있는 주소가 다르더라도 내용만 같으면 두 변수는 동등하다고 할 수 있습니다.


애너테이션에 대해 설명해주세요.

애너테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다.

대표적으로 @Override 애너테이션이 있습니다.


제네릭에 대해 설명해주세요.

제네릭은 자바의 타입 안정성을 맡고 있습니다.

컴파일 과정에서 타입체크를 해주는 기능으로 객체의 타입 안정성을 높이고 형 변환의 번거로움을 줄여줍니다.


컬렉션 프레임워크에 대해 설명해주세요.

널리 알려져 있는 자료구조를 바탕으로 객체나 데이터를 효율적으로 관리할 수 있는 표준화된 방법을 제공하는 라이브러리를 의미합니다.

자바 컬렉션에는 대표적으로 List, Set, Map 인터페이스를 기준으로 여러 구현체가 있습니다.


직렬화와 역직렬화에 대해 설명해주세요.

직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술이며, 역직렬화는 변환된 데이터를 다시 변환하는 기술을 의미합니다.

자바 직렬화는 JVM의 메모리에서만 상주되어 있는 객체 데이터를 영속화(Persistence)가 필요할 때 사용합니다. 시스템이 종료되더라도 없어지지 않는 장점을 가지며 영속화된 데이터이기 때문에 네트워크로 전송이 가능합니다.


Java에서 null을 안전하게 다루는 방법에 대해 설명해주세요.

공개 메서드가 아닌 곳에는 assert를 사용하여 null을 방어할 수 있습니다.

또한, Objects.requireNonNull()을 사용하여 방어할 수 있습니다.

그리고 Optional을 사용해 리턴 타입에서 null을 반환하지 안도록 방어할 수 있습니다.

마지막으로 사전 조건과 사후 조건을 명확히 하여 계약에 의한 설계를 실천해야 합니다.




Spring

Spring DI/IoC의 동작 방식에 대해 설명해주세요.

IoC(제어의 역전)는 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것으로 코드의 최종 호출을 개발자가 제어하는 것이 아닌 프레임워크의 내부에서 결정된 대로 이루어집니다.

DI(의존관계 주입)는 Spring 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다.

스프링에서는 스프링 컨테이셔 ApplicationContext를 이용하여 설정 정보를 생성, 등록하고 필요한 객체를 생성자 혹은 setter를 통해 주입합니다.


Spring Bean에 대해 설명해주세요.

IoC 컨테이너 안에 들어있는 객체로 필요할 때 IoC 컨테이너에서 가져와서 사용합니다. @Bean 애너테이션을 사용하거나 xml 설정을 통해 일반 객체를 Bean으로 등록할 수 있습니다.


IoC 컨테이너의 역할에 대해 설명해주세요.

애플리케이션 실행 시점에 빈 오브젝트를 인스턴스화하고 DI한 후에 최초로 애플리케이션을 기동할 빈 하나를 제공해줍니다.


Spring Bean의 생성 과정에 대해 설명해주세요.

객체 생성, 의존 설정, 초기화, 사용, 소명 과정의 생명주기를 가지고 있습니다. Bean은 스프링 컨테이너에 의해 생명주기를 관리하며 빈 초기화 방법은 @PostConstruct 애너테이션을 사용하고, 빈 소멸에서는 @PreDestroy 애너테이션을 사용합니다.

생성한 스프링 빈을 등록할 때는 ComponentScan을 이용하거나 @Configuration의 @Bean 애너테이션을 사용하여 빈 설정파일에 직접 빈을 등록할 수 있습니다.


DI의 종류는 어떤 것이 있고, 이들의 차이는 무엇인지 설명해주세요.

DI는 생성자 삽입, Setter를 이용한 메서드 매개 변수 삽입, 필드 주입이 있습니다.

생성자 주입은 생성자 호출 시점에 딱 한 번만 호출되는 것을 보장하며 불변, 필수 의존 관계에 사용합니다.

Setter 주입은 선택, 변경 가능성이 있는 의존 관계에 사용되며 스프링빈을 선택적으로 등록이 가능합니다.

필드 주입은 @Authwired 애너테이션을 사용하는데 외부에서 변경이 불가능하여 테스트 하기 힘듭니다. DI 프레임워크 없이는 작동하기 힘들며, 주로 애플리케이션과 관계 없는 테스트코드나 @Configuration 애너테이션 같은 스프링 설정 목적으로 사용합니다.


Autowiring 과정에 대해 설명해주세요.

컨테이너에서 타입(인터페이스 또는 오브젝트)을 이용해 의존 대상 객체를 검색하고 할당할 수 있는 빈 객체를 찾아 주입합니다.


POJO에 대해 설명해 주세요.

POJO는 프레임워크의 인터페이스, 클래스를 구현하거나 확장하지 않은 단순한 클래스로 Java에서 제공하는 API 외에 종속되지 않습니다.

특정 환경에 종속되지 않아 코드가 간결하고 테스트 자동화에 유리합니다.

스프링에서는 도메인과 비즈니스 로직을 수행하는 대상이 POJO 대상이 될 수 있습니다.


Spring Bean의 Scope에 대해 설명해주세요.

빈 스코프는 빈이 존재할 수 있는 범위를 뜻하며 싱글톤, 프로토타입, request, session, application 등이 있습니다.

싱글톤은 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.

프로토타입은 빈의 생성과 의존 관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다.

request는 웹 요청이 들어오고 나갈 때까지 유지하는 스코프이고, session은 웹 세션이 생성, 종료할때까지 유지하는 스코프이며, application은 웹 서블릿 컨텍스트와 같은 범위로 유지하는 스코프입니다.


Bean 애노테이션과 Component 애너테이션과 둘의 차이점에 대해 설명해주세요.

두 애너테이션 모두 IoC 컨테이너에 Bean으로 등록하기 위해 사용합니다.

Component 애너테이션은 개발자가 작성한 class를 기반으로 실행 시점에 인스턴스 객체를 1회 생성합니다.(싱글톤)

Controller, Service, Repository 애너테이션은 모두 Component 애너테이션이며, 실행 시점에 자동으로 의존성을 주입합니다.

Bean 애너테이션은 개발자가 작성한 method를 기반으로 메서드에서 반환하는 객체를 인스턴스 객체로 1회 생성합니다.(싱글톤)


의존성과 설정값을 생성자 인자로 주입해야 하는 이유에 대해 설명해주세요.

모든 의존성을 생성자를 통해 주입하면, 인스턴스 생성 시 즉시 어떠한 동작을 실행할 수 있습니다. 또한 추가적인 설정은 필요하지 않으며, 뜻하지 않게 의존성과 설정값을 빠뜨리는 일이 발생하지 않고 테스트에도 용이합니다.



JPA

JPA 영속성 컨텍스트의 이점을 설명해주세요.

영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 의미합니다.

영속성 컨텍스트를 쓰는 이유는 1차 캐시, 동일성 보장, 쓰기 지연, 변경 감지, 지연 로딩이 있습니다.

1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓습니다.

동일성 보장: 동일성 비교가 가능합니다.(==)

쓰기 지연: 트랜잭션을 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 SQL을 바로 보내지 않고 모아서 보낼 수 있습니다.

변경 감지(Dirty checking): 스냅샷을 1차 캐시에 들어온 데이터를 찍습니다. commit 되는 시점에 Entity와 스냅샷과 비교하여 update SQL을 생성합니다.

지연 로딩: 엔티티에서 해당 엔티티를 불러올 때 그 때 SQL을 날려 해당 데이터를 가져옵니다.


JPA를 사용하는 이유에 대해 설명해주세요.

JPA를 사용하는 이유는 객체지향 프레임워크이기 때문입니다. JPA를 사용하면 비즈니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현할 수 있으며, 그로 인해 생산성이 높아진다고 볼 수 있습니다.

또한, JPA는 JPQL로 SQL을 추상화하기 때문에 RDBMS Vendor에 관계없이 동일한 쿼리를 작성해서 같은 동작을 기대할 수 있다는 장점이 있습니다.


N + 1 문제는 무엇이고 이것이 발생하는 이유와 해결 방법에 대해 설명해주세요.

N + 1 쿼리 문제는 즉시 로딩과 지연 로딩 전략 각각의 상황에서 발생할 수 있으며, 하위 엔티티들이 존재하는 경우, 한 쿼리에서 모두 가져오는 것이 아니라, 필요한 곳에서 각각 쿼리가 발생하는 경우를 말합니다.

즉시 로딩에서 발생하는 이유는 JPQL을 사용하는 경우 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시 로딩 전략이 동작하기 때문입니다.

지연 로딩에서 발생하는 이유는 지연 로딩 전략을 사용한 하위 엔티티를 로드할 때, JPA에서 프록시 엔티티를 unproxy할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다.

해결 방법으로는 Fetch Join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는 EntityGraph 애너테이션을 사용하는 방법, Fetch 애너테이션의 FetchMode를 SUBSELECT로 설정하여 사용하는 방법, BatchSize 애너테이션을 사용해 조절하거나 전역적인 Batch-size를 설정하는 방법이 있습니다.



네트워크

TCP와 UDP의 차이점에 대해서 설명해주세요.

TCP는 연결 지향형 프로토콜이고 UDP는 데이터를 데이터그램 단위로 전송하는 프로토콜입니다.

TCP는 가상 회선을 만들어 신뢰성을 보장하도록 하는 프로토콜로 따로 신뢰성을 보장하기 위한 절차가 없는 UDP에 비해 속도가 느린 편 입니다.

TCP는 파일 전송과 같은 신뢰성이 중요한 서비스에 사용되고, UDP는 스트리밍, RTP와 같이 연속성이 더 중요한 서비스에 사용됩니다.

UDP는 신뢰성을 UDP 자체에서 보장하지 않는 것 뿐이지, 개발자가 직접 신뢰성을 보장하도록 할 수 있습니다. 그래서 HTTP/3은 QUIC이라는 프로토콜을 기반으로 하는데, QUIC은 UDP를 기반으로 합니다. 즉 UDP 자체는 신뢰성을 보장하지 않지만, 추가적인 정의를 통해서 신뢰성을 보장 받을 수 있습니다.


HTTP와 HTTPS의 차이점에 대해서 설명해주세요.

HTTP는 따로 암호화 과정을 거치지 않기 때문에 중간에 패킷을 가로채거나 수정할 수 있기 때문에 보안이 취약합니다. 이를 보완하기 위해 나온 것이 HTTPS입니다. HTTPS는 중간에 암호화 계층을 거쳐서 패킷을 암호화합니다.


HTTPS와 SSL Handshake에 대해 설명해주세요.

HTTPS는 HTTP에 보안 계층을 추가한 것으로 제 3자 인증, 공개키 암호화, 비밀키 암호화를 사용합니다.

제 3자 인증은 믿을 수 있는 인증기관에 등록된 인증서만 신뢰하는 것이고, 공개키 암호화는 비밀키를 공유하기 위해 사용하며, 비밀키 암호화는 통신하는 데이터를 암호화 하는데 사용합니다.

클라이언트는 TCP 3Way handshake를 수행한 이후 client hello를 전송하며, 서버는 인증서를 보냅니다.

클라이언트는 받은 인증서를 신뢰하기 위해서 등록된 인증기관인지 확인합니다. 이 인증서는 인증기관의 개인키로 암호화되어 있으며, 공개키로 검증할 수 있습니다.

서버의 공개키로 통신에 사용할 비밀키를 암호화해서 서버에 보내고, 서버는 이를 개인키로 확인하고 이후 통신은 공유된 비밀키로 암호화되어 통신합니다.

profile

랑아

@RangA

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!