보안, 커뮤니케이션 Interview 대비

JWT, OAuth, 함수형 프로그래밍,팀프로젝트

Posted by iheese on November 29, 2022 · 10 mins read

보안

JWT가 무엇인가요?

  • JWT(Json Web Token)는 유저를 식별하고 인증하기 위해 토큰 인증 방식에서 사용됩니다.
  • JWT의 큰 특징은 무상태성(Stateless)인 환경에서 사용자 데이터를 주고 받을 수 있게 됩니다.
  • JWT는 Header, Payload, Signiture로 구분됩니다.
    • Header : 토큰의 타입, 암호화 알고리즘을 담고 있습니다.
    • Payload : 토큰의 정보를 담는 부분입니다.
    • Signiture : 토큰의 신뢰성 보장, 전자서명이 담겨 있습니다.


비대칭키 암호화, 대칭키 암호화는 무엇인가요?

  • 비대칭키 암호화란 공개키 암호화라고 하기도 하며, 공개키는 공개되어 있고, 비밀키는 내부적으로 가지고 있어 각각의 키로 암호화하고 복호화할 수 있는 방식입니다.
    • 대칭키를 공유하는 방식보다는 비교적 안전하지만 연산 성능이 떨어지는 편입니다.
  • 대칭키 암호화란 양측이 동일한 키를 가지고 있으며, 암호화와 복호화에 동일한 키를 사용하는 방식입니다.
    • 이 방식은 비밀키가 노출되면 큰 문제가 생길 수 있으며, 연산 성능은 상대적으로 빠릅니다.
  • 두 암호화 방식의 장점을 이용하기 위해 HTTPS의 SSL Handshake는 비대칭키 암호화를 기반으로 연결하여 대칭키를 이용하여 통신합니다.


OAuth에 대해 설명해주세요.

  • OAuth는 제 3자 인증 방식입니다. 사용자는 서버를 신뢰할 수 없고, 서버에서 사용자의 민감정보를 관리하는 일에는 리소스가 필요합니다. 그래서 OAuth는 신뢰할 수 있는 서버에게 정보를 맡겨놓고 접근할 수 있는 권한을 주는 것으로 이해하면 됩니다.


디자인 패턴

GoF(Gang of Fout) 디자인 패턴

  • 생성(creational) 패턴 : 객체 생성에 관련된 패턴, 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성 제공
  • 구조(structural) 패턴 : 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴, 서로 다른 인터페이스 2개를 지닌 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공
  • 행위(behavioral) 패턴 : 객체나 클래스 사이 알고리즘, 책임 분배에 관련된 패턴, 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 그러면서 객체 간 결합도를 최소화로 낮춘다.


학습 및 예제 깃헙


생성 패턴

팩토리 메서드(factory method)

  • 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.
  • SRP 원칙에 부합하다. 제품 생성 코드를 분리하여 유지 보수를 쉽게 한다.
  • OCP 원칙에 부합하다. 기존 클라이언트 코드를 훼손하지 않고 새로운 유형의 제품을 도입할 수 있다.

추상 팩토리(abstract factory)

  • 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공합니다. 구상 클래스는 서브 클래스에서 만듭니다.
  • SRP 원칙에 부합하다. 제품 생성 코드를 분리하여 유지 보수를 쉽게 한다.
  • OCP 원칙에 부합하다. 기존 클라이언트 코드를 훼손하지 않고 새로운 변형 도입 가능하다.

싱글톤 패턴(singleton )

  • 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴입니다.
  • 하나의 인스턴스만 생성하며, getInstance 메소드로 모든 클라이언트에게 동일한 인스턴스를 반환합니다.
  • private 생성자를 가지고, 내부에 static 객체를 생성하고 메소드를 통해 동일한 객체를 리턴해줍니다.
public class Singleton {
    private Singleton() {}
    private static Singleton singleton = null;

    public static Singleton getInstance () {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}
  • SRP 원칙을 위반한다. 두 가지 문제를 동시에 해결한다.
    • 클래스의 인스턴스가 하나만 있도록 하고, 해당 인스턴스에 대한 전역 접근 지점을 제공하기 때문이다.
  • 다중 스레드 이슈가 생길 수 있고, 싱글턴 클래스의 생성자는 비공개이기 때문에 테스트하기 어려울 수 있다.

빌더(builder)

  • 상황에 따라 동적인 인자를 필요로 하는 객체를 생성하기 위한 디자인 패턴
  • SRP 원칙에 부합하다. 복잡한 생성 코드를 분리 할 수 있기 때문이다.

프로토타입(prototype)

  • 코드를 그들의 클래스에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 생성 디자인 패턴


구조 패턴

컴퍼지트(composite) 패턴

  • 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별 없이 다루게 해주는 패턴

데코레이터(decorator) 패턴

  • 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
  • SRP 원칙에 부합한 패턴입니다. 모놀리식 클래스를 여러 개의 작은 클래스로 나눌 수 있습니다.

퍼사드 패턴

  • 라이브러리, 프레임워크, 다른 클래스의 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴입니다.

브릿지 패턴

  • 추상부와 구현부를 분리하는 디자인 패턴입니다. 해당 패턴에서 기능은 인터페이스를 통해 정의 및 이용되고 해당 인터페이스를 따르는 클래스를 통해 구현됩니다. 해당 패턴을 통해 추상부와 구현부를 독립적으로 수정 및 확장할 수 있습니다.
  • SRP 원칙에 부합한 패턴입니다. 상위 수준 논리와 구현 세부 정보에 집중할 수 있습니다.
  • OCP 원칙에 부합한 패턴입니다. 새로운 추상화들과 구현들을 상호 독립적으로 도입할 수 있습니다.

어댑터(adapter)

  • A, B 다른 인터페이스가 있을 때 B의 인터페이스에 어댑터 패턴을 적용하여 A의 구현체처럼 사용하게 하는 것
  • SRP 원칙에 부합하다. 기본 비즈니스 로직에서 인터페이스 또한 데이터 변환 코드를 분리한다.
  • OCP 원칙에 부합하다. 클라이언트가 클라이언트 인터페이스를 통해 작동한다면 기존의 클라이언트 코드를 수정하지 않아도 새로운 유형을 추가할 수 있다.

프록시(proxy)

  • 가벼운 작업은 프록시로 처리하고 무거운 작업은 실제 객체를 이용하는 방법
  • OCP 원칙에 부합하다. 서비스, 클라이언트 변경하지 않아도 새 프록시 도입 가능하다.
  • 응답이 느려져 성능 이슈가 생길 수 있다.


행위 패턴

옵저버(observer)

  • 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴
  • OCP 원칙에 부합한 패턴입니다. 발행자 코드를 변경하지 않고도 새로운 구독자 클래스를 도입할 수 있다. 또한 구독자들 클래스를 변경하지 않고도 새로운 발행자 클래스를 추가할 수 있다.

스테이트(state)

  • 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴
    • 메소드가 실행될 때 모드도 전환(변경)되는 패턴

스트래티지(strategy)

  • 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
  • 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴
    • 예시
    • 인터페이스 생성, 해당 인터페이스를 여러 개로 구현, 다형성을 이용해 서로 교환 가능하게 구현 가능
    • Interface x = new InterfaceImpl1();
    • Interface x = new InterfaceImpl2();
  • OCP 원칙을 만족한다. 전략을 선택하는 주체인 컨텍스트 코드 변경없이 전략을 추가할 수 있다.

템플릿 매소드(template method)

  • 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
    • 예시
    • 추상 클래스에 여러 추상 메소드 1,2,3 선언, 내부에 1,2,3 합친 메소드 A 선언
    • 해당 추상 클래스를 실제로 다른 패키지에서 구현하여 작동하게 한다.
    • 메소드 A를 실행하면 1,2,3 단계 별로 실행되며, 추가적인 로직이 있으면 간단히 추가할 수 있다.
  • 중복 코드를 줄일 수 있다.
  • 자식 클래스를 통해 상위 클래스의 동작 의도가 바뀔 수 있다. 리스코프 치환 원칙을 위반할 수 있다.

커맨드(command)

  • 실행될 기능을 캡슐화함으로써 주어진 여러 가능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
  • SRP 원칙에 부합하다. 작업을 호출하는 클래스들을 실행될 기능과 구분한다.
  • OCP 원칙에 부합하다. 기존 클라이언트 코드를 건드리지 않고 커맨드를 도입할 수 있다.


다양한 디자인 패턴에 대한 설명_GURU


함수형 프로그래밍이란?

  • 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식, 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법
  • 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 한다.
    • 클린 코드(Clean Code)의 저자 Robert C.Martin은 함수형 프로그래밍을 대입문이 없는 프로그래밍이라고 정의하였다.

함수형 프로그래밍의 특징

순수함수

  • 동일한 입력에는 항상 같은 값을 반환하는 함수(외부 전역 변수가 영향을 미치면 안된다.)
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자 값을 변경하거나 프로그래밍 상태를 변경하는 사이드 이펙트가 없을 것

비상태, 불변성

  • 함수형 프로그래밍은 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요할 경우 복사본을 만들어 일부를 변경하고 변경한 복사본을 사용한다.

선언형 함수

  • 명령형 프로그래밍(일반적으로 사용해왔던)은 무엇을 어떻게 할 것인가에 주목하고
  • 선언형 프로그래밍은 무엇을 할 것인가에 주목한다.
  • if, switch, for 등의 명령문을 사용하지 않는다.

1급 객체, 고차함수

  • 함수형 프로그래밍에서는 함수가 1급 객체가 된다.
  • 1급 객체란?
    • 변수나 데이터 구조 안에 담을 수 있다.
    • 파라미터로 전달할 수 있다.
    • 반환값으로 사용할 수 있다.
    • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
    • 동적으로 프로퍼티 할당이 가능하다.
  • 고차함수란?
    • 함수를 인자로써 전달할 수 있어야 한다.
    • 함수의 반환값으로 또 다른 함수를 사용할 수 있다.

장점

  • 높은 수준의 추상화
  • 함수 단위의 코드 재사용이 수월
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다.

단점

  • 순수함수 구현하는 과정이 쉽지 않고 가독성이 떨어질 수 있다.
  • 반복이 for이 아닌 재귀를 통해 이뤄지는데 무한루프 가능성이 존재한다.
  • 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것이 쉽지 않다.


커뮤니케이션

  • 개인별로 준비가 필요합니다.

팀프로젝트에 대해 설명해주시고 거기서 했던 역할은 무엇인지 설명해주세요.

팀프로젝트시 갈등 상황을 말해주시고 어떻게 해결하셨는지 말해주세요.

프로젝트시 기술 적용이 어려웠던 것에 대해 말해주세요.

일정이 예상보다 지연될 것 같습니다. 어떻게 해결하실 것인가요?

등등


Reference: