Hello

01 Spark 개관

|

1. Spark란

  • 범용적 목적의 고성능 대용량 클러스터링 분산 처리 분석 플랫폼

2. 빅데이터 솔루션에서 필요한 모듈

  • 데이터 수집 모듈 : 여기저기 다양한 형태로 흩어진 데이터를 수집해서 그다음 단계에 있는 모듈에게 전달해주는 역할
    • Flume, Kafka, SQOOP, Fluentd
  • 데이터 저장 및 조회 모듈 : 수집된 데이터에 대한 CRUD과정을 수행하는 모듈
    • Hadoop, HBase, Cassandra, Redis, Pig, Hive
  • 데이터 분석 및 가공 모듈 : 데이터를 분석, 가공할수 있으며 그 결과를 외부 시스템에 전달 할 수 있는 모듈
    • R, Cloudera, Hortonworks, Mahout
  • 워크플로우 엔진 : 다양한 빅데이터 관련 소프트웨어들을 통일된 방식으로 제어하는 모듈

3. Spark의 특징

  • 플랫폼으로써의 특성(Hadoop Map&Reduce + Apache Storm + Hadoop Hive + Apache Mahout)
    • 기존에는 데이터 정제 및 가공을 하기 위해서 Map&Reduce를 사용하고, sql을 사용하기 위해서는 hive를 사용하는 등 다양한 플랫폼을 도입해야 했었지만 Spark 하나의 시스템만을 설치해도 batch, streaming, graph processing, sql 등의 처리가 가능
    • 기존의 Workflow
      • 데이터 수집 -> 데이터 저장(HDFS) -> 데이터 정제 및 처리(Map&Reduce, HIVE) -> 데이터 분석 및 시각화(Mahout, R)
    • Spark를 이용한 Workflow
      • 데이터 수집 -> 데이터 저장(HDFS) -> 데이터 정제, 처리, 요약데이터, 시각화, 분석(Spark)
  • 빠른속도 : 파일 시스템 기반으로 처리하는 Hadoop의 Map&Reduce와 달리 메모리 기반 데이터 처리방식이어서 빠를수 밖에 없음
  • 다양한 언어 지원(스파크 구현 자체는 Scala, API 지원은 Scala, Java, Python, R)

4. Spark Stack 구조

Alt text

  • 인프라 계층 : 먼저 스파크가 기동하기 위한 인프라는 Spark 가 독립적으로 기동할 수 있는 Standalone Scheudler가 있고 (그냥 스팍만 OS위에 깔아서 사용한다고 보면 됨) 또는 하둡 종합 플랫폼인 YARN 위에서 기동될 수 있고 또는 Docker 가상화 플랫폼인 Mesos 위에서 기동될 수 있다.
  • Spark Core : 메모리 기반의 분산 클러스터 컴퓨팅 환경인 Spark 코어가 그 위에 올라간다.
  • Built-in Library
    • SparkSQL : 빅데이타를 SQL로 핸들링
    • Spark Streaming : 실시간으로 들어오는 데이타에 대한 리얼타임 스트리밍 처리
    • MLib (machine learning) : 머신러닝
    • GraphX (graph) : 그래프 데이타 프로세싱

5. Spark Cluster 구조

Alt text

  1. Driver Program : 스파크 프로그램. 여러 개의 병렬적 작업으로 나눠져 Worker Node에 있는 Executor에서 실행
  2. SparkCotext : 메인 시작 지점. 스파크API를 활용하기 위해 필요하다. 클러스터의 연결을 보여주고 RDD를 만드는데 사용
  3. Cluster Manager : Standalone, YARN. Mesos 등 클러스터 자원 관리자
  4. Worker Node : 하드웨어 서버. 하나의 물리적 장치에 여러 개도 가능
  5. Executor : 프로세스. 하나의 워커 노드에 여러 개 가능

6. Spark application 실행 과정

Spark application : 클러스터에서 독립된 프로세스들의 묶음으로 동작하며, 메인 프로그램(driver Program)의 SparkContext object에 의해서 조정된다.

  1. Driver Program(프로세스)가 main을 실행시키며 SparkContext 생성한다.
  2. SparkContext가 Cluster Manager에 연결된다.
  3. 연결되면, 클러스터 내의 Executor를 할당받는다.
  4. SparkContext가 application code(SparkContext에 전달된 Jar 또는 Python file)를 executor에 보낸다.
  5. SparkContext가 실행할 task를 executor에 보낸다.

7. RDD(Resilent Distributed Dataset)

  • RDD란 스파크가 사용하는 핵심 데이터 모델로서 다수의 서버에 걸쳐 분산 방식으로 저장된 데이터 요소들의 집합을 의미하며, 병렬처리가 가능하고 장애가 발생할 경우에도 스스로 복구될 수 있는 내성을 가지고 있다.
  • 즉, RDD란 스파크에서 정의한 분산 데이터 모델인데 내부에는 단위 데이터를 포함하고 있고, 저장할때는 여러 서버에 나누어 저장되며, 처리할 떄는 각 서버에 저장된 데이터를 동시에 병렬로 처리할 수 있다는 의미

8. 개발 언어 선택

  • Java, Scala, Python, R을 통해 개발 가능
  • 스파크2.0버전부터 프로그래밍 언어의 종류와 무관한 API의 성능을 제공하도록 개선됨
  • 하지만 문법의 간결함과 사용하기 편리한 API를 제공한다는 이유로 Scala를 1순위 개발언어로 추천하는 편임
  • 스파크가 Scala로 작성되었기 때문에 Scala를 모르면, 스파크 내부 코드를 수정하거나 이해하기는 힘들다는 점이 있음

9. 실제 구동 방법

  • Run-example : 스파크에 포함된 예제 소스를 구동해 볼 수 있음
    • ALS 예제(스파크 홈 경로에서)
      • 실행 : ./bin/run-example ml.ALSExample
      • 설명 : movielens 샘플 데이터(data/mllib/als/sample_movielens_ratings.txt)를 활용한 영화추천예제 소스를 실제 구동시켜 볼 수 있음
  • Spark-shell : Spark에서 지원하는 셸에서 직접 코드를 작성(PERL)해 구동해 볼 수 있음
  • Spark-submit : 실제 구현한 코드를 빌드한 뒤 구동해 볼 수 있음

10. 관련 Framework

  • 웹기반 노트북, 시각화툴 : Apache Zeppelin

References

API 보안 체크리스트

|

API 보안 체크리스트

출처 : https://github.com/shieldfy/API-Security-Checklist/blob/master/README-ko.md

API를 설계하고 테스트하고 배포할 때 고려해야 할 중요한 보안 대책 체크리스트입니다.

인증 (Authentication)

  • Basic Auth를 사용하지 말고 표준 인증방식을 사용하세요. (예로, JWT, OAuth 등)
  • 인증, 토큰 생성, 패스워드 저장은 직접 개발하지 말고 표준을 사용하세요.

JWT (JSON Web Token)

  • 무작위 대입 공격을 어렵게 하기 위해 랜덤하고 복잡한 키값 (JWT Secret)을 사용하세요.
  • 요청 페이로드에서 알고리즘을 가져오지 마세요. 알고리즘은 백엔드에서 강제로 적용하세요. (HS256 혹은 RS256)
  • 토큰 만료기간 (TTL, RTTL)안 되도록 짧게 설정하세요.
  • JWT 페이로드는 디코딩이 쉽기 때문에 민감한 데이터는 저장하지 마세요.

OAuth

  • 허용된 URL만 받기 위해서는 서버단에서 redirect_uri가 유효한지 항상 검증하세요.
  • 토큰 대신 항상 코드를 주고 받으세요. (respons_type=token을 허용하지 마세요)
  • OAuth 인증 프로세스에서 CSRF를 방지하기 위해 랜덤 해쉬값을 가진 state 파라미터를 사용하세요.
  • 디폴트 스코프를 정의하고 각 애플리케이션마다 스코프 파라미터의 유효성을 검증하세요.

접근 (Access)

  • DDoS나 무작위 대입 공격을 피하려면 요청수를 제한하세요. (Throttling)
  • MITM (중간자 공격)을 피하려면 서버단에서 HTTPS를 사용하세요.
  • SSL Strip 공격을 피하려면 HSTS 헤더를 SSL과 함께 사용하세요.

입력 및 요청 (Input)

  • 각 요청 연산에 맞는 적절한 HTTP 메서드를 사용하세요. GET (읽기), POST (생성), PUT (대체/갱신), DELETE (삭제)
  • 여러분이 지원하는 포맷 (예를 들어 application/json이나 application/json 등)만을 허용하기 위해서는 요청의 Accept 헤더의 content-type을 검증하여 매칭되는게 없을 경우엔 406 Not Acceptable로 응답하세요.
  • 요청 받은 POST 데이터의 content-type을 검증하세요. (예를 들어 application/x-www-form-urlencodedmultipart/form-data 또는 application/json 등)
  • 일반적인 취약점들을 피하기 위해선 사용자 입력의 유효성을 검증하세요. (예를 들어 XSS, SQL-Injection 또는 Remove Code Execution 등)
  • URL에는 그 어떤 민감한 데이터 (자격 인증 (crendentials), 패스워드, 보안 토큰 또는 API 키)도 포함하고 있어서는 안되며 이러한 것들은 표준 인증 방식의 헤더를 사용하세요.

서버 처리

  • 잘못된 인증을 피하기 위해 모든 엔드포인트가 인증 프로세스 뒤에서 보호되고 있는지 확인하세요.
  • 사용자의 리소스 식별자를 사용하는건 지양하세요. /user/654321/orders 대신 /me/orders를 사용하세요.
  • 자동 증가 (auto-increment) 식별자 대신 UUID를 사용하세요.
  • XML 파일을 파싱하고 있다면, XXE (XML 외부 엔티티 공격, XML external entity attack)를 피하기 위해 엔티티 파싱을 비활성화 하세요.
  • XML 파일을 파싱하고 있다면, 지수적 엔티티 확장 공격을 통한 빌리언 러프/XML 폭탄을 피하기 위해 엔티티 확장을 비활성화 하세요.
  • 파일 업로드에는 CDN을 사용하세요.
  • 거대한 양의 데이터를 다루고 있다면, HTTP 블로킹을 피하고 응답을 빠르게 반환하기 위해 워커나 큐를 사용하세요.
  • 디버그 모드를 꺼놓는일은 절대 잊지 마세요.

반환 및 응답

  • X-Content-Type-Options: nosniff 헤더를 반환하세요.
  • X-Frame-Options: deny 헤더를 반환하세요.
  • Content-Security-Policy: default-src 'none' 헤더를 반환하세요.
  • X-Powered-By, Server, X-AspNet-Version 등의 디지털 지문 (fingerprinting) 성격의 헤더는 제거하세요.
  • 응답에 content-type을 강제하세요. 만약 application/json 데이터를 반환하고 있다면 응답의 content-typeapplication/json입니다.
  • 자격 인증 (crendentials), 패스워드, 보안 토큰과 같은 민감한 데이터는 반환하지 마세요.
  • 각 연산에 맞는 적절한 상태 코드를 반환하세요. (예를 들어 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed 등)

Contribution

Feel free to contribute , fork -> edit -> submit pull request. For any questions drop us an email at team@shieldfy.io.

Reference

https://github.com/shieldfy/API-Security-Checklist/blob/master/README-ko.md

Observer

|

MVC

|

Singleton

|

싱글턴 패턴(Singleton Pattern)

1. 싱글턴 패턴 이란?

  • 디자인 패턴의 하나로, 한 프로그램 내에서 해당 클래스의 인스턴스가 하나만 만들어지고, 그 인스턴스에 접근할 수 있도록 하기 위한 패턴
  • 주로 하나의 프로그램 내에서 공통적으로 쓰이는 자원을 관리, 저장하는 역할을 할때 사용
  • 사용예 : 커넥션 풀, 스레드 풀, 디바이스 설정 객체

2. 기본적인 형태

  • Singleton 클래스 선언
    public class Singleton {
      private static Singleton singleton;
    
      private Singleton() {
      }
    
      public static Singleton getInstance() {
          if(singleton == null){
              singleton = new Singleton();
          }
          return singleton;
      }
    }
    
  • Singleton 클래스 사용
    public class Main {
      public static void main(String[] args) {
          Singleton obj1 = Singleton.getInstance();
          Singleton obj2 = Singleton.getInstance();
          if(obj1 == obj2){
              System.out.println("obj1과 obj2는 같은 인스턴스입니다.");
          } else {
              System.out.println("obj1과 obj2는 다른 인스턴스입니다.");
          }
      }
    }
    

3. 이슈