ElasticSearch 설치 on Mac

ElasticSearch 설치 on Mac

엘라스틱 서치를 Mac 에 설치하기. 

1. brew인스톨 하기. 

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. elasticsearch 설치하기. 


brew install homebrew/versions/elasticsearch14

3. elasticsearch 실행하기. 

elasticsearch --config=/usr/local/opt/elasticsearch14/config/elasticsearch.yml


4. Shards 와 replicas 조정하기


curl -X PUT "localhost:9200/news" -d '{"setting":{"index":{"number_of_shards":2, "number_of_replicas":1}}}'
{"acknowledged":true}
A. Shard개수를 늘이면 : 
  - 쓰기 속도 향상
  - 인덱스 throughtout이 향상됨
B. Replicas개수를 늘이면 : 
  - 인덱스의 영속성이 증가됨 (즉, 저장 안정성이 올라감)
  - 읽기 throughtout이 향상됨
  - 그러나 디스크 스페이스는 많이 필요로함. 

5. 설정파일 분석 


##################### Elasticsearch Configuration Example #####################



# This file contains an overview of various configuration settings,
# targeted at operations staff. Application developers should
# consult the guide at <http://elasticsearch.org/guide>.
# 이 파일은 다양한 설정 전체를 포함하고 있다. 
# 어플리케이션 개발자는 <http://elasticsearch.org/guide>를 참고하기 바란다. 
#

# The installation procedure is covered at
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.
# 인스톨 과정은 아래 경로에서 확인해보자. 
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.


# Elasticsearch comes with reasonable defaults for most settings,
# so you can try it out without bothering with configuration.
# Elasticsearch 는 대부분의 의미있는 기본 설정을 지정한다. 
# 그러므로 설정을 어렵지 않게 조정할 수 있다. 

#
# Most of the time, these defaults are just fine for running a production
# cluster. If you're fine-tuning your cluster, or wondering about the
# effect of certain configuration option, please _do ask_ on the
# mailing list or IRC channel [http://elasticsearch.org/community].
# 대부분 이런 기본 설정들로 실제 사용할 클러스터들에 적용할 수 있다. 
# 만약 클러스터 튜닝을 좀더 잘 하고자 하거나, 특정 설정 옵션의 기능에 대해서 알고자 한다면 메일링 리스트
# [http://elasticsearch.org/community] 로 혹은 IRC채널로 문의 바란다. 

# Any element in the configuration can be replaced with environment variables
# by placing them in ${...} notation. For example:
#node.rack: ${RACK_ENV_VAR}
#
# 설정에 존재하는 엘리먼트는 환경 변수로 대체할 수 있다. ${...} 표기법을 이용하면 되며 다음 예와 같이 적용할 수 있다.
#node.rack: ${RACK_ENV_VAR}

# For information on supported formats and syntax for the config file, see
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>
# 지원되는 포맷과 문법에 대해서 정보를 얻고자 한다면 다음 경로에서 찾아보자. 
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>

################################### Cluster [클러스터 설정] ###################################

# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
# 클러스터 이름은 자동으로 검색이될 클러스터의 이름을 지정하는 곳이다. 
# 만약 복수개의 클러스터를 동일한 네트워크에서 사용한다면 유니크한 이름을 사용하는 것이 좋다. 

cluster.name: elasticsearch_KIDO


#################################### Node #####################################

# Node names are generated dynamically on startup, so you're relieved
# from configuring them manually. You can tie this node to a specific name:
#
# Node 이름들은 실행될때 동적으로 생성된다. 그러므로 수동으로 직접 설정하지 않아도 된다. 
# 이 노드 이름을 직접 아래와 같이 지정해도 된다. 
#node.name: "Franz Kafka"

# Every node can be configured to allow or deny being eligible as the master,
# and to allow or deny to store the data.
# 각 노드는 allow혹은 deny로 설정이 가능하다. 이것은 마스터의 자격을 가질지 지정하는 것이다. 
# 그리고 데이터를 저장할지 여부도 결정할 수 있다. 

# Allow this node to be eligible as a master node (enabled by default):
# 아래는 노드를 마스터로 지정될 수 있도록 설정하고 있다. (enabled가 기본값이다.)
#node.master: true
#
# Allow this node to store data (enabled by default):
# 아래는 데이터를 저장할지 여부를 지정한다. (enabled가 기본값이다.)
#node.data: true

# You can exploit these settings to design advanced cluster topologies.
# 아래 설정은 향상된 클러스터 토폴로지 설계를 위해 이용하는 것이다. 

# 1. You want this node to never become a master node, only to hold data.
#    This will be the "workhorse" of your cluster.
# 1. 만약 이 노드를 절대 마스터 노드로 지정하고 싶지 않고, 데이터만 저장하는 것으로 지정하는 경우라면 다음과 같다.
# 이는 "workhorse" 로 만드는 것이다. 
#
#node.master: false
#node.data: true
#
# 2. You want this node to only serve as a master: to not store any data and
#    to have free resources. This will be the "coordinator" of your cluster.
# 2. 이 노드를 오직 마스터 서버로만 사용하고자 할때 적용할 수 있다. 데이터를 저장하지 않고, free리소스를 가지는 경우 설정이다.
# 이것은 "coordinator" 로 만든다.  
#node.master: true
#node.data: false
#
# 3. You want this node to be neither master nor data node, but
#    to act as a "search load balancer" (fetching data from nodes,
#    aggregating results, etc.)
# 3. 만약 마스터 노드도 아니고 데이터 노드도 아니게 만들수 있다. 그러나 "search load balancer"로 지정할 수 있다.
# 노드에서 데이터를 패치하고 결과를 집계하는 용도로 사용할 수 있다. 
#node.master: false
#node.data: false

# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
# Node Info API [http://localhost:9200/_nodes] or GUI tools
# such as <http://www.elasticsearch.org/overview/marvel/>,
# <http://github.com/karmi/elasticsearch-paramedic>,
# <http://github.com/lukas-vlcek/bigdesk> and
# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.

# Cluster Health API를 이용하는 것 [http://localhost:9200/_cluster/health], 
# 노드 정보 API [http://localhost:9200/_nodes] 혹은
# GUI 툴 <http://www.elasticsearch.org/overview/marvel/>, 
# <http://github.com/karmi/elasticsearch-paramedic>,
# <http://github.com/lukas-vlcek/bigdesk> and
# <http://mobz.github.com/elasticsearch-head> 는 클러스터의 상태를 인스펙트 할 수 있다. 

# A node can have generic attributes associated with it, which can later be used
# for customized shard allocation filtering, or allocation awareness. An attribute
# is a simple key value pair, similar to node.key: value, here is an example:

# 노드는 generic어트리뷰트를 가지고 연계할 수 있다. 이것은 나중에 샤드 할당 필터링으로 이용할 수 있거나
# 혹은 allocation 인식등에 이용된다. 
# attribute는 단순한 key, value쌍으로 구성한다. 이는 node.key: value형태와 유사하다. 
#node.rack: rack314

# By default, multiple nodes are allowed to start from the same installation location
# to disable it, set the following:
# 기본적으로 복수 노드들은 동일한 설이 위치부터, disable 가 되는 것까지 다음처럼 설정할 수 있따. 
#node.max_local_storage_nodes: 1


#################################### Index 인덱스  ####################################

# You can set a number of options (such as shard/replica options, mapping
# or analyzer definitions, translog settings, ...) for indices globally,
# in this file.
# 다음 몇가지 옵션들을 설정할 수 있다. (shart/replica옵션과 같이, 매핑 혹은 분석 정의를 할 수 있다. 또는 설정 변환등..)
# 글로벌 인덱스 설정은 이 파일에서 지정이 가능하다. 
#
# Note, that it makes more sense to configure index settings specifically for
# a certain index, either when creating it or by using the index templates API.
# 노트, 하나의 인덱스를 특별한 인덱스로 설정할 수 있게 만들수 있다. 인덱스를 생성하거나, 인덱스 템플릿 API를 생성하는 것도 가능하다. 
#
# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>
# for more information.

# Set the number of shards (splits) of an index (5 by default):
# 인덱스의 shart의 개수를 지정한다. 5가 기본값이다. 
#index.number_of_shards: 5

# Set the number of replicas (additional copies) of an index (1 by default):
# 인덱스의 복제 계수를 지정한다. 1이 기본값이다. 
#index.number_of_replicas: 1

# Note, that for development on a local machine, with small indices, it usually
# makes sense to "disable" the distributed features:
# 노트, 로컬 머신에서 개발을 할때에는 작은 인덱스를 지정하고, 보통 분산 기능을 "disable"로 지정한다. 
#index.number_of_shards: 1
#index.number_of_replicas: 0

# These settings directly affect the performance of index and search operations
# in your cluster. Assuming you have enough machines to hold shards and
# replicas, the rule of thumb is:
# 이 세팅들은 인덱스와 검색 오퍼레이션의 성능에 직접적인 영향을 주는 것이다. 
# 샤드를 홀딩하고 복제를 위한 충분한 머신이 있다고 가정하면 이러한 룰을 적용할 수 있다. 
#
# 1. Having more *shards* enhances the _indexing_ performance and allows to
#    _distribute_ a big index across machines.
# 1. *shards* 를 많이 가지면 _indexing_ 성능을 향상하고, 큰 인덱스들을 머신에걸쳐 분산할 수 있다. 
# 2. Having more *replicas* enhances the _search_ performance and improves the
#    cluster _availability_.
 # 2. 더 많은 *replicas*를 가지면 _search_성능을 향상하고, 클러스터의 가용성을 더 올릴수 있다. 
#
# The "number_of_shards" is a one-time setting for an index.
# "number_of_shards"는 하나의 인덱스에 대한 한번의 세팅이다. 
#
# The "number_of_replicas" can be increased or decreased anytime,
# by using the Index Update Settings API.
# "number_of_replicas"는 언제든지 증가되거나 감소될수 있다. 이것은 인덱스 업데이트 설정 API를 이용하면 된다. 

# Elasticsearch takes care about load balancing, relocating, gathering the
# results from nodes, etc. Experiment with different settings to fine-tune
# your setup.
# Elasticsearch는 로드 밸런싱, 재할당, 노드 결과 수집 등등을 수행할 수 있다. 
# 설정을 통해서 적합한 설정을 실험해 볼 수 있다. 

# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
# the index status.
# Indes Status API를 (<http://localhost:9200/A/_status>) 이용하여 인덱스의 상태를 확인할 수 있다.  


#################################### Paths ####################################

# Path to directory containing configuration (this file and logging.yml):
# Path는 설정이 있는 경로를 나타낸다. (이 파일과 logging.yml)이 그것이다. 
#path.conf: /path/to/conf

# Path to directory where to store index data allocated for this node.
# Path 인덱스 데이터를 이 노드에 어디에 할당할지를 지정한다. 
path.data: /usr/local/var/elasticsearch/
#
# Can optionally include more than one location, causing data to be striped across
# the locations (a la RAID 0) on a file level, favouring locations with most free
# space on creation. For example:
# 산텍적으로 하나 이상의 설정을 지정할 수 있다. 이것은 로케이션을 거쳐서 스트라이프 하도록 데이터를 지정할 수 있다. (RAID 0) 참조
# 대부분 빈 공간으로 설정되도록 하는 것이 좋다. 
#
#path.data: /path/to/data1,/path/to/data2

# Path to temporary files:
# Path : 임시 파일 
#path.work: /path/to/work

# Path to log files:
# Path : 로그 파일 
path.logs: /usr/local/var/log/elasticsearch/

# Path to where plugins are installed:
# Path : 플러그인이 인스톨된 위치
path.plugins: /usr/local/var/lib/elasticsearch/plugins

#################################### Plugin ###################################

# If a plugin listed here is not installed for current node, the node will not start.
# 만약 나열된 플러그인이 현재 노드에 설치되어 있지 않은경우 노드는 시작하지 않는다. 
#plugin.mandatory: mapper-attachments,lang-groovy


################################### Memory ####################################

# Elasticsearch performs poorly when JVM starts swapping: you should ensure that
# it _never_ swaps.
# Elasticsearch는 JVM swapping이 시작되면 성능이 형편없이 떨어진다. 그러므로 반드시 _never_ swaps로 지정해야한다.
#
# Set this property to true to lock the memory:
# 이 프로퍼티는 메모리 락을 true로 설정하는 것이다. 
#bootstrap.mlockall: true

# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
# to the same value, and that the machine has enough memory to allocate
# for Elasticsearch, leaving enough memory for the operating system itself.
# ES_MIN_MEM과 WS_MAX_MEM 환경 변수가 동일한 값으로 설정되어 있는지 확인한다. 그리고 장비가 elasticsearch를 위해
# 메모리를 충분히 할당하였는지 운영체제 자체를 위해 충분한 메모리를 남겨 두었는지 확인하자. 

# You should also make sure that the Elasticsearch process is allowed to lock
# the memory, eg. by using `ulimit -l unlimited`.
# 또한 elasticsearch가 메모리 락을 걸수 있도록 설정되어 있는지 확인하자. 
# `ulimit -l unlimited`를 이용한다. 


############################## Network And HTTP ###############################

# Elasticsearch, by default, binds itself to the 0.0.0.0 address, and listens
# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
# communication. (the range means that if the port is busy, it will automatically
# try the next port).
# Elasticsearch는 기본적으로 0.0.0.0 주소로 바인딩 된다. 그리고 포트번호 9200-9300는 HTTP트래픽을 을 리슨한다.
# 9300-9400은 node-to-node커뮤니케이션 용으로 사용된다. (range는 포트가 바쁜경우 자동적으로 다음 포트로 할당되도록 한다.)

# Set the bind address specifically (IPv4 or IPv6):
# 바인드 주소를 지정할 수 있다. (IPv4, IPv6)
#network.bind_host: 192.168.0.1

# Set the address other nodes will use to communicate with this node. If not
# set, it is automatically derived. It must point to an actual IP address.
# 노드와 커뮤니케이션 할 수 있도록 주소를 설정한다. 만약 설정하지 않는다면 자동으로 만들어 진다. 
# 이는 반드시 유효한 IP주소에 할당 되어야 한다. 
#network.publish_host: 192.168.0.1

# Set both 'bind_host' and 'publish_host':
# 'bind_host'와 'publish_host' 둘다 설정한다. 
network.host: 127.0.0.1

# Set a custom port for the node to node communication (9300 by default):
# 커스텀 포트를 설정하여 node to node간 통신을 하도록 한다. (9300은 기본값임)
#transport.tcp.port: 9300

# Enable compression for all communication between nodes (disabled by default):
# 노드간 통신을 압축할지 지정한다. (disabled가 기본값이다.)
#transport.tcp.compress: true

# Set a custom port to listen for HTTP traffic:
# HTTP트래픽을 위한 커스텀 포트를 지정한다. 
#http.port: 9200

# Set a custom allowed content length:
# 허용하는 컨텍스트의 크기를 지정한다. 
#http.max_content_length: 100mb

# Disable HTTP completely:
# HTTP 를 완젼히 disable하게 만든다. 
#http.enabled: false


################################### Gateway ###################################

# The gateway allows for persisting the cluster state between full cluster
# restarts. Every change to the state (such as adding an index) will be stored
# in the gateway, and when the cluster starts up for the first time,
# it will read its state from the gateway.
# gateway는 전체 클러스터들간의 상태를 저장하도록 허용한다. 각 변경은 gateway에 저장된다. (인덱스 포함) 
# 그리고 클러스터는 첫번째에 시작되고 gateway로 부터 상태를 읽을 수 있게 된다. 

# There are several types of gateway implementations. For more information, see
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.
# gateway 구현에 대한 몇가지 타입에 대한 정보를 보고자 한다면 다음을 참조하자. 
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.

# The default gateway type is the "local" gateway (recommended):
# 기본 gateway는 "local" gateway이며 (추천한다)
#gateway.type: local

# Settings below control how and when to start the initial recovery process on
# a full cluster restart (to reuse as much local data as possible when using shared
# gateway).
# 아래 컨트롤을 어떻게 언제 전체 클러스터 재시작시 복구 프로세스를 시작할지 설정한다. (gateway를 공유할때 가능한한 로컬 데이터를 이용한다.)

# Allow recovery process after N nodes in a cluster are up:
# 복구 프로세스를 허용하여 N개 노드 클러스터가 업된 후에 처리된다. 
#gateway.recover_after_nodes: 1

# Set the timeout to initiate the recovery process, once the N nodes
# from previous setting are up (accepts time value):
# 초기 복구 프로세스의 타임아웃을 설정한다. 이느 이전 설정이 올라가고부터 지정되는 값이다. 
#gateway.recover_after_time: 5m

# Set how many nodes are expected in this cluster. Once these N nodes
# are up (and recover_after_nodes is met), begin recovery process immediately
# (without waiting for recover_after_time to expire):
# 얼마나 많은 노드가 이 클러스터를 기대하는지 설정한다. N노드들이 올라가고, 복구프로세스는 즉시 수행된다. 
# (expire이후 recover를 기다리지 않고)
#gateway.expected_nodes: 2


############################# Recovery Throttling #############################

# These settings allow to control the process of shards allocation between
# nodes during initial recovery, replica allocation, rebalancing,
# or when adding and removing nodes.
# 이 설정들은 노드들이 초기화 복구를 수행, 복제 할당, 리밸런싱, 노드의 삭제, 추가등을 하는 동안에 샤드 할당 처리를 컨트롤 하도록 한다. 

# Set the number of concurrent recoveries happening on a node:
# 노드에 동시 복구처리될 개수를 지정한다. 
# 1. During the initial recovery
# 1. 초기복구 동안 
#cluster.routing.allocation.node_initial_primaries_recoveries: 4
#
# 2. During adding/removing nodes, rebalancing, etc
# 2. 노드를 추가/제거하는 동안 리팰런싱 동안. 
#
#cluster.routing.allocation.node_concurrent_recoveries: 2

# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
# 복구중에 throttle throughput설정 (예, 100mb, 기본은 20ms)
#indices.recovery.max_bytes_per_sec: 20mb

# Set to limit the number of open concurrent streams when
# recovering a shard from a peer:
# open concurrent stream의 수를 제한한다. 이때에는 각 피어로 부터 사드 복구가 수행될때 
#indices.recovery.concurrent_streams: 5


################################## Discovery ##################################

# Discovery infrastructure ensures nodes can be found within a cluster
# and master node is elected. Multicast discovery is the default.
# Discovery는 노드들이 클러스터를 찾을 수 있게 한다. 기본 discovery는 기본이다. 

# Set to ensure a node sees N other master eligible nodes to be considered
# operational within the cluster. This should be set to a quorum/majority of
# the master-eligible nodes in the cluster.
# 이 설정은 quorum/majority를 설정하는 것으로 마스터로 선출된 노드들을 설정한다. 
#discovery.zen.minimum_master_nodes: 1

# Set the time to wait for ping responses from other nodes when discovering.
# Set this option to a higher value on a slow or congested network
# to minimize discovery failures:
# 다른 노드로 부터 ping응답을 기다리는 시간을 설정한다. 이 설정을 높에 갑으면 
#discovery.zen.ping.timeout: 3s

# For more information, see
# 더 많은 정보를 보려면 
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>

# Unicast discovery allows to explicitly control which nodes will be used
# to discover the cluster. It can be used when multicast is not present,
# or to restrict the cluster communication-wise.
# Unicast는 노드가 클러스터 복구를 수행되어지는 경우 명시적이 컨트롤이 되도록 한다.
# 이것은 몰티케스트가 없을때 혹은 클러스터 커뮤니케이션 방법에 제약이 갈때 이용될 수 있다. 
#
# 1. Disable multicast discovery (enabled by default):
# 1. 멀티캐스트 discovery를 disable한다. (기본값은 enabled이다. )
#discovery.zen.ping.multicast.enabled: false
#
# 2. Configure an initial list of master nodes in the cluster
#    to perform discovery when new nodes (master or data) are started:
# 2. 마스터 노드의 초기화 리스트의 설정을 통해서 클러스터내에 새로운 노드라 시작된경우 발견하도록 한다. 
#discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

# EC2 discovery allows to use AWS EC2 API in order to perform discovery.
# EC2 발견은 AWS EC2 API를 사용하도록 한다. 이는 discovery를 위해 사용된다. 
# You have to install the cloud-aws plugin for enabling the EC2 discovery.
# cloud-aws플러그인을 설치해야 EC2 discovery를 이용할 수 있다. 
# For more information, see
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html>
#
#
# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/>
# for a step-by-step tutorial.

# GCE discovery allows to use Google Compute Engine API in order to perform discovery.
# GCE discovery는 Google Compute Engine API를 이용하도록 해주며, discouvery를 수행한다. 
# You have to install the cloud-gce plugin for enabling the GCE discovery.
# cloud-gce플러그인을 설치해야 GCE discovery가 가능하다. 
#
# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-gce>.

# Azure discovery allows to use Azure API in order to perform discovery.
# Azure discovery는 Azure API를 발견하도록 허용한다. 
# You have to install the cloud-azure plugin for enabling the Azure discovery.
# cloud-azure플러그인이 설치되어야 Azure 발견이 가능하다. 
# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-azure>.

################################## Slow Log ##################################

# Shard level query and fetch threshold logging.
# Shard 레벨 쿼리와 페치 스레쉬홀드 로깅 

#index.search.slowlog.threshold.query.warn: 10s
#index.search.slowlog.threshold.query.info: 5s
#index.search.slowlog.threshold.query.debug: 2s
#index.search.slowlog.threshold.query.trace: 500ms

#index.search.slowlog.threshold.fetch.warn: 1s
#index.search.slowlog.threshold.fetch.info: 800ms
#index.search.slowlog.threshold.fetch.debug: 500ms
#index.search.slowlog.threshold.fetch.trace: 200ms

#index.indexing.slowlog.threshold.index.warn: 10s
#index.indexing.slowlog.threshold.index.info: 5s
#index.indexing.slowlog.threshold.index.debug: 2s
#index.indexing.slowlog.threshold.index.trace: 500ms

################################## GC Logging ################################

#monitor.jvm.gc.young.warn: 1000ms
#monitor.jvm.gc.young.info: 700ms
#monitor.jvm.gc.young.debug: 400ms

#monitor.jvm.gc.old.warn: 10s
#monitor.jvm.gc.old.info: 5s
#monitor.jvm.gc.old.debug: 2s

################################## Security ################################

# Uncomment if you want to enable JSONP as a valid return transport on the
# http server. With this enabled, it may pose a security risk, so disabling
# it unless you need it is recommended (it is disabled by default).
# JSONP를 원하는 경우 커멘트를 제거하여 http서버를 통해 수행할 수 있다. 
# 이것을 활성화 하면 보안 리스크가 올 수 있다. 그리고 필요하지 않은경우 disabling으로 설정하기를 추천한다. 
#http.jsonp.enable: true

Web Security Service Model

Web Security Service Model 

Security Service Model은 다음과 같은 6가지로 분류 할 수 있다.

1. Session-based security
2. HTTP Basic Authentication
3. Digest Authentication
4. Certificate Based security
5. XAuth
6. OAuth

1. Session Based Security

- 서버 사이드에서 사용자의 식별 정보를 세션에 저장하는 모델
- 서버에서 보안이 필요한 리소스에 대한 요청을 받으면, 사용자 식별 정보를 세션에서 조회한다. 세션에 존재하는 경우 응답을 수행하지만, 그렇지 못한경우 로그인 요청한다.



A. 클라이언트가 보안이 걸린 리소스에 접근한다.
B. 보안 필터에서 해당 유저의 승인 정보가 세션에 존재하는지 검사한다.
C. 세션에 사용자 정보가 없음을 알린다.
D. 로그인 화면을 클라이인터에 노출한다.
E. 사용자 아이디/비번을 입력하고 인증 요청을 한다.
F. Authentication을 통해서 해당 유저가 적법한 유저인지 검사한다.
G. 적법한 유저인경우 승인정보를 세션에 저장한다.
H. Authorization을 통해 요청에 대한 허가를 한다.
I. 리소스에 접근한다.
J. 접근한 리소스를 클라이언트에 내려보내준다.

- Session Based Security는 매우 직관적이다.
- 그러나 최근 Stateless 서비스를 지원해주지 못한다.
- 상태정보를 세션에 저장해야하므로 Scale out 확장이 어렵다. (세션서버등 추가작업이 또 필요함)


2. HTTP Basic Authentication

- 사용자 인터렉션, 서버간의 인증 작업에서도 사용할 수 있다.
- 보안된 리소스에 클라이언트가 접근하는 경우 서버는 401 "Unauthorized"응답 코드와 "WWW-Authenticate"헤더를 보낸다.

응답예)
- 보안된 리소스에 접근하면 다음과 같은 Header가 Client로 전송된다.

GET /resource
401 Unauthorized
WWW-Authenticate: Basic realm="SecurityResource"

- Basic : Basic Authenticate를 이용했다는 것을 의미한다.
- realm : 보안 대상이 되는 리소스 위치를 의미한다.

username과 password는 ":"를 구분자로 하여 Base64인코딩이 수행된다.
이렇게 인코딩이 된 정보는 서버로 전송이 된다.

GET /resource
Authorization: Basic hXY123HWKFKL34kdf
서버는 수신받은 credential 을 받으면 디코딩을 수행하고 검증한다.
성공적으로 검증이 되면 리소스를 클라이언트로 전송한다.


A. 보안된 리소스를 요청한다.
B. 서버는 401을 반환하고 인증 정보를 요청한다.
C. 클라이언트는 username:password를 Base64인코딩하여 서버로 반환한다.
D. 서버는 Decode를 수행하고 적법한 사용자인지 검사한다.
E. 적법한 사용자인경우 보안된 리소스를 반환한다.

- 클라이언트가 인증정보를 매번 서버로 전송하기 때문에 stateless를 유지할 수 있다.
- 그러나 클라이언트는 단순히 encoding을 수행하는 것이지, 암호화 하는 것이 아니다.
- 즉, SSL/TLS 기반의 통신이 아닌경우라면 man-in-the-middle 공격에 매우 취약한 구조가 된다. (바로 username/password가 털릴수 있다. )

3. Digest Authentication

- Basic Authentication과 유사하다.
- 서버는 401 상태코드를 클라이언트로 저장하고, 클라이언트는 서버로 WWW-Athenticate헤더에 Digest를 실어서 보낸다.

GET /resource
401 Unauthorized
WWW-Authenticate: Digest realm="SecurityResource", nonce="Xskldjfoqtj029sdlfj", qop="auth"
서버에서 생성한 nonce와 qop를 이용하여 Digest 를 수행한다.
nonce는 암호화를 목적으로 하는 임의의 토큰이다.
qop는 "Quality Of Protection"으로 "auth"와 "auth-int"가 올수 있다.

- qop="auth" : digest는 authentication목적으로 사용된다는 것을 말한다.
  > digest는 다음과 같이 생성된다.
hash_value_1 = MD5(username:realm:password)
hash_value_2 = MD5(request_method:request_url)
digest = MD5(hash_value_1:nonce:hash_value2)

- qop="auth-int" : 는 digest가 authentication목적으로 사용되고 integrity 요청을한다.
  > digest는 다음과 같이 생성된다.
hash_value_1 = MD5(username:realm:password)
hash_value_2 = MD5(request_method:request_uri:MD5(request_body)
digest = MD5(hash_value_1:nonce:hash_value_2)

- 기본적으로 MD5알고리즘은 해시 값을 계산할때 사용된다.
- digest는 Authorization헤더를 서버로 전송된다.
- 요청을 받으면 서버는 digest를 계산하고, 사용자 정보를 검증한다.


A. 클라이언트가 보안된 리소스를 요청한다.
B. 서버는 401과 Digest 인증 요청을 한다. nonce와 qop를 클라이언트로 보냄
C. 클라이언트는 Digest 생성규칙에 따라 Digest생성한다.
D. Digest를 서버로 전송한다.
E. 서버에서 Digest를 검증한다.
F. 보안된 리소스를 반환한다.

- Basic Authentication보다 더 보안에 강하다.
- SSL/TLS상에서 커뮤니케이션 하지 않는경우 여전히 중간에서 Digest를 탈취하여 재현할 수 있다.
- 서버에서 생성된 nonce와 qop는 1회성이다. 즉 매번 Digest를 생성하고 검증해야함을 의미한다.
- 단방향 알고리즘을 이용할때 bcrypt등을 이용하여 더욱 보안을 강화할 수 있다.

4. Certificate-Based Security

- Certificate-Based Security는 Certificate를 필요로 하는 보안이다. 이는 파티의 식별을 수행하는 방식으로 수행된다.
- SSL/TLS 기반의 커뮤니케이션에서 클라이언트는 브라우저 등에서 서버의 인증을 인증서를 검증한다. 이 모델은 상호 인증을 수행하면서 길어질 수 있다. 서버는 클라이언트 인증을 SSL/TLS핸드쉐이크 과정에서 요청할 수 있고, 이를 통해 클라이언트를 식별할 수 있다.
- 이 접근 방법은 보호된 자원 요청을 수신받으면 서버는 클라이언트로 인증 정보를 보낸다. 클라이언트는 서버가 신뢰된 Certificate Authority(CA)이라는 것을 확인하고, 인증서를 서버로 보내게 된다.
- 서버는 클라이언트의 인증서를 검증하고 적법한경우 보호된 자원을 반환한다.


- Certificate-Base security 모델은 보안정보를 전송하지 않고 제거한다. 이는 username/password 모델보다 더욱 보안에 강하다.
- 그러나 인증서 배포와 관리비용이 높을 수 있어 보통 큰 시스템에 이용한다.

5. XAuth

- 사용자의 이름과 비밀번호를 저장하지 않고 보안을 제공해준다.
- 클라이언트에서 사용자 이름과 비번을 서버로 전송하면, 서버에서는 해당 정보를 검증하고 토큰을 발행하여 클라이언트로 내려보내준다.
- 클라이언트는 수신받은 토큰정보를 저장하고, 이름과 비밀번호를 파기한다.
- 클라이언트가 이후 보안된 자원을 요청하게 되면 토큰을 전송한다. 이는 X-Auth-Token 헤더와 같은 곳에 실어서 전송하게 된다.
- 토큰의 수명은 서비스에 의해 결정이 된다. 토큰은 그것이 expire되기전까지 다양한 요청을 revoke할 수 있다.


A. 사용자가 필요한 인터넷 접근을 수행하기 위해서 클라이언트 접속
B. 클라이언트에서 Credential을 사용자에게 요청
C. 사용자는 username/password를 클라이언트로 전송
D. 클라이언트는 서버로 Username/Password를 다시 전송
E. 서버는 검증을 통해서 AccessToken을 발행하여 클라이언트로 전송
F. Access Token을 저장하고 보안된 자원에 접근이 필요한경우 AccessToken을 전송함
G. 서버는 유효기간 내의 AccessToken인경우 보안된 자원을 반환함

- 동일한 조직에서 상호간 통신을 할때 매우 유용한 모델이다.

6. OAuth 2.0

- Open Authorization 혹은 OAuth는 보호된 자원에 접근하기 위해서 사용자의 패스워드를 저장하는 대신 사용하는 프레임 워크이다.
- OAuth 2.0에서 규정하는 역할
1. Resource Owner : resource owner는 그들의 어카운트나 자원에 접근하기를 원하는 개체이다.
2. Client : 사용자의 자원에 접근하는 어플리케이션이다.
3. Authorization Server : 사용자의 실별정보를 검증하고 사용자 리소스에 접근하기 위한 토큰을 생성한다.
4. Resource Server : 보호된 사용자의 리소스 가지고 있는 서버이다.
- SSL기반위에서 상기 역할들 상호간에 통신이 이루어 진다.



- OAuth를 이용하기 전에 사전에 사용자가 Authorization Server에 정보가 등록 되어 있어야 한다.

A. 사용자가 클라이언트에 서비스를 이용하기 위해 접근한다.
B. 클라이언트는 사용자에게 인증 요청을 하라고 한다.
C. 사용자는 인도된 Authorization서버에 접속하여 인증 과정을 거친다.
D. 적법한 사용자인경우 인증 완료되었음을 Client에 알려준다.
E. Client는 어플리케이션 이용을 위한 Access Token을 인증서버에 요청한다.
F. 인증 서버는 Access Token을 발급한다.
G. Access Token으로 사용자가 접근하고자 하는 자원에 접근한다.
H. 유효한 Access Token인경우 보안된 리소스를 반환한다.

- OAuth2의 장점은 다양한 클라이언트를 수용한다는 것이다. 웹 어플리케이션, 네이티브 어플리케이션, User Agent/Browser어플리케이션등 다양한 곳에 이용될 수 있다.

- Access Token이 발급되면 이후 인터렉션은 Access Token으로만 수행한다. 즉, 사용자의 이름/비밀번호가 공유되지 않는다.
- Access Token은 만료 기간까지 사용할 수 있으며, 만료된 경우 Refresh Token을 이용하여 Access Token을 갱신할 수 있다.


참고 Link :
http://foorious.com/webdev/auth/oauth2/
http://code.pearson.com/pearson-learningstudio/apis/authentication/authentication-concepts/concept-oauth-2_x


Richardson's Maturity Model

Richardson's Maturity Model


- (RMM)은 Leonard Richardson에 의해서 개발된 REST 기반의 웹 서비스 분류법이다.
- 4단계로 분류하고 있다.

Richardson's Maturity Model

- RMM은 서로다른 웹 서비에 대해서 이들간의 디자인, 이점, 균형들에 대해서 이해할 수 있도록 해준다.

Level Zero :
  - 가장 기본적인 성숙 레벨이다.
  - HTTP를 전송 메커니즘으로 사용하고, 원격 프로시저 콜을 하나의 URL을 이용하여 수행한다.
  - 보통 POST와 GET HTTP 메소드를 이용한다.
  - SOAP, XML-RPC 기반의 웹 서비스가 여기에 해당한다.

Level One :
  - 복수개의 URI를 통해서 REST에 더욱 가깝게 다가가는 모델이다.
  - 이는 하나의 리소스에 하나의 URL을 할당한다.
  - 큰 서비스 엔드포인트의 복잡한 기능을 복수개의 리소스로 분리하여 구축한다.
  - 그러나 서비스는 하나의 HTTP Verb를 이용한다. 보통 POST로 모든 처리를 한다.

Level Two :
  - HTTP프로토콜을 이용하고, HTTP verb를 적절하게 사용한다. 그리고 상태 코드를 통해서 적절한 응답을 제공한다.
  - CRUD 서비스를 제공한다.

Level Three :
  - 가장 성숙된 모델이다. 이것은 Hypermedia의 개념을 바탕으로 구축이 된다.
  - 어플리케이션 상태 엔진과 HATEOAS를 이용한다.
  - 이 서비스에서는 컨텐츠 내용을 통해서 관련된 리소스와 컨트롤을 파악할 수 있고, 이에따라 다음 행동을 취할 수 있도록 한다.


HTTP Status Code

HTTP Status Code

Http Status Code 분류 

1. Informational Codes : 
  - 서버가 요청을 받아 들였으나 아직 끝나지 않은 상태를 의미한다. 
  - 100 번대 코드

2. Success Codes : 
  - 요청을 성공적으로 수신했고 처리 했음을 의미한다. 
  - 200 번대 코드

3. Redirection Codes :
  - 요청을 성공적으로 수행했으나 클라이언트가 추가적인 액션을 해야 모든 요청이 끝이남을 의미한다. 
  - 이 액션은 보통 redirecting을 수행하여 다른 리소스를 받아야 하는 경우 사용됨
  - 300 번대 코드

4. Client Error Codes :
  - 클라이언트 요청에 문제가 있을경우를 의미한다. 
  - 400 번대 코드

5. Server Error Codes :
  - 클라이언트 요청을 처리하는데 서버 상에서 오류가 났음을 의미한다. 
  - 500 번대 코드 

현재 사용되는 상태 코드

100 : Continue 
  - 서버가 첫번째 요청의 부분을 수신했음을 나타낸다. 남은 요청이 아직 남아 있을 것임을 의미한다. 

200 : OK
  - 모든 요청이 성공적으로 수행되었다. 

201 : Created
  - 요청이 완료 되었고 새로운 리소스가 생성 되었다. 

202 : Accepted
  - 요청이 받아졌다. 그라나 처리중에 있다. 

204 : No Content
  - 서버가 요청을 모두 처리하였으나, 클라이언트에 보낼 데이터가 없다

301 : Move Permanently
  - 요청된 자원이 새로운 위치로 이동 되었고, 이 자원에 접근하기 위해서는 새로운 URI가 필요하다는 것을 나타낸다. 

400 : Bad Request
  - 클라이언트 요청이 형식에 맞지 않고, 서버는 이 요청을 이해할 수 없다.

401 : Unauthorized
  - 클라이언트는 자원에 접근하기 전에 인증을 받아야 한다. 만약 요청이 이미 클라이언트의 Credential 정보를 포함하고 있다면 401은 유효하지 않는 Credential 정보라는 것을 의미한다. 

403 : Forbidden
  - 서버는 요청을 이해했다. 그러나 이 요청을 거부한다. 
  - 클라이언트가 Blacklist IP에 속하거나, 승인 타임을 벗어난 요청인경우 발생될 수 있다. 

404 : Not Found
  - 요청된 URI에 원하는 리소스가 없다 

406 : Not Acceptable 
  - 서버는 요청을 처리할 수 있다. 그러나 생성된 응답을 클라이언트가 받을 수 없을 경우이다. 
  - 이것은 클라이언트가 헤더를 받을때 너무 엄격하거나 까다로운경우 발생할 수 있다.

500 : Internal Server Error
  - 서버가 요청을 처리하는 도중 에러가 발생하였다. 요청은 완료될 수 없다.

503 : Service Unavailable
  - 요청이 완료될 수 없다. 서버에 부하가 걸렸거나, 점검 상태에 들어간 경우일 수 있다. 
  - 서버 장비가 다운 되었을때도 나타난다. ex) nginx 살아있음, tomcat 죽음 ...


Spring Boot Part01

Spring Boot 

- Spring Boot의 주요 feature


1. Spring Boot starters
    - Spring Boot starters는 하나의 dependency로 필요한 많은 공통의 의존성을 모아놓은 것이다.
    - Maven이나 Gradle에서 간단히 추가해서 사용할 수 있다.

2. Autoconfiguration
    - Autoconfiguration은 Spring 4.0에서 지원되는 조건적 설정과 함께 필요한 설정을 자동추가한다.

3. Command-line interface (CLI)
    - CLI는 Groovy 개발자에게 자동 설정과 스프링 개발을 단순하게 해주는 기능을 제공한다.

4. Actuator
    - Actuator는 Spring Boot에 대해서 관리 기능을 제공해준다.


- Spring Boot 시작 패키지 다운로드 받기. 

http://start.spring.io


- 프로젝트 생성하기. 

1. Generate a [Gradle Project | Maven Project] 에서 필요한 프로젝트 관리 도구를 선택하자.


2. 프로젝트 기본항목 설정하기. :


Group : com.kido.media
Artifact : springboot-tutorial
Name : springboot-tutorial
Description : Demo project for Spring Boot
Package Name : com.kido.media
Packaging : Jar [War]
Java Version : 1.8
Language : Java

3. 필요한 Dependency 추가하기.

- Switch back to the simple version 을 누르면 필요한 Dependency를 추가할 수 있다.

3.1 Core Dependency

Core


Secure your application via spring-security

Aspect-oriented programming including spring-aop and AspectJ

JTA distributed transactions via Atomikos

JTA distributed transactions via Bitronix

Spring's Cache abstraction

Spring Boot Development Tools

JSR-303 validation infrastructure (already included with web)

Lombok

Web


Full-stack web development with Tomcat and Spring MVC

Websocket development with SockJS and STOMP

Contract-first SOAP service development with Spring Web Services

the Jersey RESTful Web Services framework

Spring Boot integration for the Ratpack framework

Vaadin

Exposing Spring Data repositories over REST via spring-data-rest-webmvc

HATEOAS-based RESTful services

Browsing Spring Data REST repositories with an HTML UI

Simplify the development of mobile web applications with spring-mobile

Document RESTful services by combining hand-written and auto-generated documentation

Template Engines


FreeMarker templating engine

Velocity templating engine

Groovy templating engine

Thymeleaf templating engine, including integration with Spring

Mustache templating engine

Data


JDBC databases

Java Persistence API including spring-data-jpa, spring-orm and Hibernate

Persistence support using Java Object Oriented Querying

MongoDB NoSQL Database, including spring-data-mongodb

Cassandra NoSQL Database, including spring-data-cassandra

REDIS key-value data store, including spring-redis

GemFire distributed data store including spring-data-gemfire

Apache Solr search platform, including spring-data-solr

Elasticsearch search and analytics engine including spring-data-elasticsearch

Cloud Core


Simplifies connecting to services in cloud platforms, including spring-cloud-connector and spring-cloud-cloudfoundry-connector

spring-cloud-context (e.g. Bootstrap context and @RefreshScope)

Secure load balancing and routing with spring-cloud-security

OAuth2 and distributed application patterns with spring-cloud-security

Cloud Config


spring-cloud-config Client

Central management for configuration via a git or svn backend

Configuration management with Zookeeper and spring-cloud-zookeeper-config

Configuration management with Hashicorp Consul

Cloud Discovery


Service discovery using spring-cloud-netflix and Eureka

spring-cloud-netflix Eureka Server

Service discovery with Zookeeper and spring-cloud-zookeeper-discovery

Service discovery with Cloud Foundry

Service discovery with Hashicorp Consul

Cloud Routing


Intelligent and programmable routing with spring-cloud-netflix Zuul

Client side load balancing with spring-cloud-netflix and Ribbon

Declarative REST clients with spring-cloud-netflix Feign

Cloud Circuit Breaker


Circuit breaker with spring-cloud-netflix Hystrix

Circuit breaker dashboard with spring-cloud-netflix Hystrix

Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events

Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (choose a specific Stream binder implementation to complement this)

Cloud Tracing


Distributed tracing via logs with spring-cloud-sleuth

Distributed tracing via Zipkin and spring-cloud-sleuth-zipkin

Cloud Messaging


A simple control bus with AMQP and spring-cloud-bus-amqp

A simple control bus with Redis and spring-cloud-bus

A simple control bus with Kafka and spring-cloud-bus

Inter instance control events with Hashicorp Consul

Messaging microservices with RabbitMQ

Messaging microservices with Redis

Messaging microservices with Kafka

Cloud AWS


AWS native services from spring-cloud-aws

Relational databases on AWS with RDS and spring-cloud-aws-jdbc

Messaging on AWS with SQS and spring-cloud-aws-messaging

Cloud Cluster


Leadership election and global state with Redis and spring-cloud-cluster-redis

Leadership election and global state with Zookeeper and spring-cloud-cluster-zookeeper

Leadership election and global state with Hazelcast and spring-cloud-cluster-hazelcast

Database


H2 database (with embedded support)

HSQLDB database (with embedded support)

Apache Derby database (with embedded support)

MySQL jdbc driver

PostgreSQL jdbc driver

Social


spring-social-facebook

spring-social-linkedin

spring-social-twitter

I/O


Spring Batch including HSQLDB database

Common spring-integration modules

Activiti BPMN workflow engine

Java Message Service API via Apache Artemis

Java Message Service API via HornetQ

Advanced Message Queuing Protocol via spring-rabbit

javax.mail

Ops


Production ready features to help you monitor and manage your application

API documentation for the Actuator endpoints

CRaSH shell integration





상기 기술된 의존성중 필요한 의존성을 추가하여 Spring Boot 프로젝트 생성하자.

우리는 여기서 Web, JPA 를 추가할 것이다.