최근 컨테이너 기술기반의 도커가 주목받고 있습니다.
기존의 서버 가상화 기술보다 자원관리 측면에서 효율이 더 좋기 때문인데요.
관심있으신 분들을 위해 제가 공부하고 있는 것들을 두서없이 나열해보고자 합니다!
아직 학기 중이라서 나중에 시간이 된다면 체계적으로 올려보도록 하겠습니다.
아래 URL을 따라 학습하였습니다!
1. 도커란?
* 아래 사진은 도커에서 Apache 이미지를 검색하고 다운 받는 것을 보여줍니다.
최근 컨테이너 기술기반의 도커가 주목받고 있습니다.
기존의 서버 가상화 기술보다 자원관리 측면에서 효율이 더 좋기 때문인데요.
관심있으신 분들을 위해 제가 공부하고 있는 것들을 두서없이 나열해보고자 합니다!
아직 학기 중이라서 나중에 시간이 된다면 체계적으로 올려보도록 하겠습니다.
아래 URL을 따라 학습하였습니다!
1. 도커란?
* 아래 사진은 도커에서 Apache 이미지를 검색하고 다운 받는 것을 보여줍니다.
SK Tech에서 교육과정을 이수하는 중 Nodejs 서버를 구축하게 되었는데요.
CRUD에 충실한 간단한 서버이지만, 단순 ec2 서버에서 AWS 아키텍처를 적용했을 떄
를 측정하기 위해 서버 부하테스트를 진행하기로 했습니다.
선택의 기준은 다음과 같습니다.
* 제 능력상 사용할 수 있는지
* 빠르게 사용가능한지
* 모니터링이 되는지
1. ApacheBench (http://httpd.apache.org/docs/2.2/en/programs/ab.html): 아파치에서 기본적으로 제공하는 기능으로 HTTP 웹서버의 성능을 측정할 때 자주 사용하는 도구이고, 간단하기 떄문에 사용해보도록 하겠습니다.
2. Goad (https://goad.io/): "AWS Lambda 를 활용하여 부하를 분산 생성하여 테스트를 수행하는 오픈 소스 툴로서 Go 언어로 개발 되었습니다. 실제 AWS 의 이점과 AWS Lambda 의 강력함을 잘 활용한 툴 입니다." 라고 설명이 되어 있지만, 명확한 DOCUMENT도 없고 기술지원이 잘 되고 있지 않아서, 제 능력상 배제하였습니다.
1. AWS EC2 상에 서버가 있기 때문에 Elastic Search를 사용할 것입니다
Elastic Search : Amazon Elasticsearch Service를 사용하면 손쉽게 Elasticsearch를 배포, 운영 및 확장하여 로그 분석, 전체 텍스트 검색, 애플리케이션 모니터링 등을 수행할 수 있습니다. Amazon Elasticsearch Service는 Elasticsearch의 간편한 API 및 실시간 기능과 더불어 프로덕션 워크로드에 필요한 가용성, 확장성, 보안성을 제공하는 완전 관리형 서비스입니다.
추가 소프트웨어를 설치할 필요 없이 자동으로 EC2 인스턴스를 모니터링합니다.
aws에서는 위와 같은 그림의 부하 테스트 과정을 선호 합니다. 과정은 다음과 같습니다.
위의 단계에 기반하여 테스트를 진행해보도록 하겠습니다
ec2 t2.micro 환경에서 테스트 하였습니다.
<참고 사이트>
https://aws.amazon.com/ko/blogs/korea/how-to-loading-test-based-on-aws/
# Change the MySQL database collation to UTF-8 ALTER DATABASE my_database DEFAULT COLLATE utf8_unicode_ci; # Change the MySQL database character set to UTF-8 ALTER DATABASE my_database DEFAULT CHARACTER SET utf8;
: 코드 단계 별 동작 확인
: 실행 멈충 - 브레이크 포인트
: 특정 시점에서의 스택 상황
: 스코프 내 변수의 값 확인
> node --debug
> node --debug-brk
> node --debug app.js
: Webkit 기반으로 Node.JS APP 동작 디버깅
: 디버깅 시작하기
: 디버깅 모드로 시작
: Node-inspector 실행하면 url이 나타남
: 이를 웹브러우저에 넣으면 확인가능
: 코드로 테스트 하기
: 테스팅 자동화
: assert, should, mocha
: 기본 모듈, 별도 설치 불필요
: var assert = require('assert');
: 테스트 하기
: 참 테스트
: assert.ok(value[, message]) // value가 false면 메세지출력
: 동등테스트
: asser.equal(actual, expected[, message])
: 같은 객체비교, 내용비교, ===비교 세가지 종류가 있음
: 에러 발생
: assert.throws(block[,error][,message])
: BDD 방식의 assert 작성
: behavior
: should
> var intVal = 5;
> intVal.should.ASSERT
: assert 함수
: .eql(otherValue) // ==
: .equal(otherValue) // ===
: npm install -g mocha
: 테스트 자동화와 리포팅
: TDD, BDD
: 다른 Assert 라이브러리와 결합 사용
: 콘솔 종료하면 애플리케이션 종료
: forever
: 콘솔 종료와 관계없이 애플리케이션 계속 실행
: 크래쉬 -> 자동 재실행
: forever 설치 (-g)
: 명령
: forever start server.js
: forever stop [UID]
: forever stopall
: forever list
보안 (0) | 2017.04.28 |
---|---|
passport를 통한 인증 (0) | 2017.04.28 |
인증 (0) | 2017.04.27 |
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
사용자 가입과 로그인
: 가입 : 사용자 정보를 저장
: 로그인 : 사용자 정보를 전송
비밀번호 저장
: 비밀번호 암호화 저장
: 복호화 필요하지 않다
네트워크로 데이터 전송
: 데이터 암호화 - 전달
: 전달받은 암호화된 데이터 복호화
: 암호화 종류
: 복호화가 불가능한 암호화
: 복호화가 가능한 암호화
: 암/복호화
: 암호화
: 원본데이터를 변조해서 알수 없도록 변환
: 복호화
: 원본데이터로 변환
: 사용자 비밀번호 암호화 저장
: 복호화 불필요
: 해쉬
: 사용자 개인정보 전송
: 복호화 필요
: 대칭/비대칭 키 암호화
: HTTPS
: 해시란?
: 단반향으로 생성하는 값, 함수
: 해시 특징
: 고정 크기의 해쉬값
: 입력값이 같으면 해시값도 같다
: 해시값이 같아도 입력값이 같다는 보장은 없다
: 단점, 한계임
: 해시 알고리즘
: MD5, SHA
: 사용자 입력 해쉬 = DB 저장된 해쉬
: 사용자 암호에 소금 치기
: hash(charlie + !) // !가 솔트임.
: 솔트는 길게!
: 암호화 모듈
: crypto : 기본 모듈
: bcrypt : 확장 모듈
: 대칭암호
: 같은 키로 암호화/복호화
: 키를 분배해야 한다
: 알고리즘
: DES, AES(레인달 알고리즘)
: 비대칭 암호
: 서로 다른 키(개인키, 공개키)로 암호화/복호화
: 개인키 : 공개안함
: 개인키로 암호화 - 공개키로 복호화
: 공개키로 암호화 - 개인키로 복호화
: 대칭 암호에 비해서 느리다
: HTTPS(HTTP over SSL)
: 데이터 암호화 통신
: SSL
: 넷스케이프 SSL -> IETF의 TLS
: 대칭키 방식
: SSL 인증서
: 서비스를 제공하는 서버의 정보
: 신뢰성있는 인증기관 (CA)의 서버 인증
: 서버 공개키 : 비대칭 암호화 용
: 공인된 인증 기관에서 인증서 발급
: 유료
: 인증기관, Verisign, Comodo
: 사설 인증서 발급
: 키와 인증서 생성 프로그램 : openssl
: 경고발생
: 보안 서버를 만들기 위해 필요한 것
: 키
: 인증서
: 인증서 발급 단계
: 키 생성
: 키에서 인증서 발급 요청(csr) 생성
: 인증서 발급 요청에서 인증서 발급
: https 모듈 사용
: 보안서버 생성
: https.createServer(option, [])
: option 에 key, cert, passphase가 있어야함.
: express를 사용해서도 가능
: 영리 목적으로하는 개인 정보 수집 서비스는 사용해야함.
: 보안 서버 의무화
: 무료
: www.startssl.com
: letsencrypt.org
디버깅과 테스트와 프로세스 관리 (0) | 2017.04.28 |
---|---|
passport를 통한 인증 (0) | 2017.04.28 |
인증 (0) | 2017.04.27 |
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
: 서비스내 직접 인증 기능 작성(Local Auth)
: 3자 인증 기능 사용(OAuth)
: OpenID - 인증만 제공해주는 서비스
: 서비스 자체에서 사용자 가입
: 사용자 로그인 기능
: 사용자 정보 관리
: 필요한 점
: ID/PW가 서버와 클라이언트 메시지에 담겨서 이동
: 서버에 ID/PW 저장
: 사용자 정보 암호화
: 보안 통신 필요 : HTTPS
: 다른 서비스에 등록된 사용자의 인증 정보 사용
: 직접 가입/로그인 절차 없음
: ID/PW 노출 위험 적다
: 다른 서비스에서 토큰 발급
: 새로운 서비스
: 새로운 사용자라면, 인증하라고 요청
: 서비스키 제공- client_id, secret
: 가입된 서비스에 3자 인증 요청
: 가입된 서비스에 인증
: 인증 정보를 새로운 서비스에 전달
: 가입된 서비스에 인증 상황 문의
: 인증된 사용자 인지 문의
: 서비스 사용 가능
: passport, everyauth
1 : 모듈 로딩과 초기화
> var passport = require('passport');
> app.use(passport.initialize());
2 : Strategy 설정
> var Strategy = require('passport-strategy').Strategy;
> passport.use(new Strategy(function username, password, done){})
: 다양한 Strategy 제공
: Local Auth
: facebook, wirtter, google, kakao talk
3 : 인증
> app.port('login',passport,authenticate('local'))
: 인증 성공시
: 성공 메세지와 코드
: 성공 페이지 이동(웹)
: 인증 실패시
: 실패 메시지와 코드, 로그인페이지(웹)
4 : 세션 기록과 읽기
> passport.serializeUser(function(user, done){})
> passport.deserializeUser(function(id,done))
: 요청마다 세션 기록과 읽기
: passport.authenticate 이후 세션기록(serializeUser)
: 일반 요청마다 세션에서 읽기 (deserializeUser)
: 세션에서 읽어온 데이터
> req.user
5 : 사용자 정보
> req.user
설치
: npm install passport-strategy
디버깅과 테스트와 프로세스 관리 (0) | 2017.04.28 |
---|---|
보안 (0) | 2017.04.28 |
인증 (0) | 2017.04.27 |
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
: 등록된 사용자 식별
: 사용자 별 권한
: 정보 노출 방지 : 암호화 통신 방법
: 정보 해독 방지 : 데이터 암호화 저장
: 로그인 하지 않은 사용자가 쇼핑몰을 사용한다
: 쇼핑몰에서 상품을 장바구니에 넣으면
: 다음 쇼핑몰에 방문했을 때 장바구니는?
: 장바구니 내용을 브라우저에 기록
: 상품을 장바구니에 담기
: 쿠키에 장바구니 내용 저장
: 서버는 요청에서 쿠키 읽기
: 기존에 기록한 내용 확인
: 서버 -> 클라이언트
: 응답 메세지에 쿠키 기록을 위한 메세지 작성
: 메시지 헤더 : Set-Cookie 필드
: 클라이언트 -> 서버
: 클라이언트의 쿠키를 서버로 전송
: 요청 메시지 헤더의 cookie
: 쿠키 쓰기
: res.setHeader('Set-Cookie','name=value');
: 쿠키 읽기
: 쿠키 값 파싱 코드 필요
: req.headers.cookie // 'name = value'
: 쿠키 쓰기 - Express 기본
: res.cookie(이름, 값)
: res.clearCookie(이름)
: 옵션을 통해 시간, 등등을 정함.
: 쿠키 읽기 : 쿠키 파서 모듈
: npm install cookie-parser
: 미들웨어에 쿠키파서를 넣으면됨.
: req.cookies.이름
: 쿠키 서명하기
: 쿠키 변조 방지
: 서명된 쿠키 사용하기
: 쿠키파서 설정
: 쿠키쓰기
: 쿠키 읽기
: 메시지 크기가 커진다. 느려진다
: 다른 웹브라우저, 보안에 취약
: 서버에 정보 저장
: 클라이언트에는 세션 식별 정보(세션 ID)
: 세션 ID는 쿠키 사용
: 세션 모듈 : express-session
: 미들웨어에 넣는다.
: 읽고 쓰기가 간단하게 처리된다.
: 세션 - 서버에 기록
: 서버 재시작 -> 세션 기록 삭제
: 서버 메모리
: 서버 클러스터링
: 세션을 데이터 베이스에 저장
: Session Store 모듈
: 어디에 저장하는냐를 결정
: connect-mongo
: connect-redis
보안 (0) | 2017.04.28 |
---|---|
passport를 통한 인증 (0) | 2017.04.28 |
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
Nodejs와 MongoDB (0) | 2017.04.27 |
: HTTP의 한계
: socket
: 데스크탑 애플리케이션 - 가능
: 모바일 애플리케이션 - 가능
: 웹 브라우저 - 불가능
: ajax, polling, long poling, 웹 소켓...
: 다양한 시도가 있었지만, 다양한 웹 브라우저 때문에 한계가 존재.
: 여러 기술을 한번에 사용해야 된다는 어려움
: socket.io : 호환되는 기술을 자동 선택
: npm install socket.io
: 서버
: HTTP 서버
: socket.io 서버
: 클라이언트
: HTTP 클라이언트, 모바일...
: socket.io 클라이언트
: 서비스 시작
: HTTP 서버 준비
: socket.io 서버 준비
: socket.io 클라이언트 요청 - HTML로 응답
: socket.io 초기화 및 서버 접속
: 연결이 끊어 졌을 경우 자동 재접속 시도
: 메시지 주고받기 - 이벤트 기반
: 메시지 이벤트 정의
: 메시지 전송
: socket.emit('EVENT', data)
: 이벤트 수신
: socket.on('EVENT',function(data){});
: 서버에 이벤트 등록
: 클라이언트 이벤트 등록
: 서버에서 이벤트 발생
: 소켓 하나에 이벤트 발생
: 연결된 모든 소켓에 이벤트 발생
: socket.io 기본연결
: 소켓과 1:1 연결
: 모든 소켓과 통신
: 1:N 통신
: 개별 소켓과 1:1통신 N번 반복
: 네임스페이스
: 룸
: 네임스페이스로 socket.io 연결 구분
: 같은 네임 스페이스에서만 메시지 주고 받음
: 기본 네임 스페이스 : /
: 커스텀 네임 스페이스 : /NAME-SPACE
: var system = require('socket.io')(server).of('/system')
: 네임스페이스 내 채널
: 같은 룸에서만 데이터 교환
: 룸에 입장, 여러 룸에 입장 가능
: 룸에서 떠나기
: 서버쪽에서 클라이언트를 룸에 입장 시키고 퇴장시킬 수 있음.
passport를 통한 인증 (0) | 2017.04.28 |
---|---|
인증 (0) | 2017.04.27 |
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
Nodejs와 MongoDB (0) | 2017.04.27 |
Node.js와 MySQL (0) | 2017.04.27 |
: HTTP를 이용해서 구현하면 요청-응답이라는 한계때문에 실시간으로 반영하지 못함.
HTTP 통신
: 요청과 응답 기반
: 다시 요청할 때 까지 변경사항 반영 안됨
: HTTP가 아는 다른 프로토콜을 사용해야 한다 -> TCP
TCP 통신
: 네트워크 레이어 : Tranport Layer
: 스트림을 이용한 실시간 통신
: 소켓을 이용한 네트워크 프로그래밍
소켓
통신 접점
소켓 프로그래밍
: 데이터 그램 소켓 : UDP
: 스트림 소켓 : TCP
TCP
: 연결필요
: 신뢰성, 손실데이터 재전송
: 혼잡도 제어
: UDP에 비해 느림
: 신뢰성 있는 실시간 통신
: FTP, HTTP, SMTP
: UDP
: 연결 불필요
: 신뢰성 없음
: 데이터 흐름 없음
: 빠름
: 속도 중시형 실시간 통신, 스트리밍 비디오/오디오
: DNS, DHCP, SNMP
: 연결 지향이므로 연결 과정 필요
: 연결과정
1 : 서버 소켓 생성, 준비, 대기
2 : 클라이언트 소켓 연결, 소켓간 연결
3 : 데이터 교환
4 : 접속 끊기
: 스트림 기반
: 보내기 : 스트림에 write
: 받기 : 스트림에서 read
: 소켓 통신을 위한 기본 모듈 : net
> var net = require('net')
: 클래스
: net.Server, net.Socket
: 서버 생성
> net.createServer(옵션, 리스너)
: 서버 함수
: listen(port, [호스트],콜백...) : 클라이언트 접속 대기
: close(콜백) : 추가 접속을 받기 않는다.
: getConnections(콜백) : 연결 갯수
: address() : 서버 주소
: 서버 이벤트
: listening : 포트 바인딩, 접속 가능한 상태 이벤트
: connection : 클라이언트 접속 이벤트
: close : 서버 닫기(연결된 소켓이 없을때만 발생)
: error : 에러
: TCP와 비슷한 방법이지만, 커넥트 부분이 빠져있다.
: 스트링 방식이 아니라, 패킷 방식이다.
: 서버, 클라이언트 소켓 구분이 없다.
:
인증 (0) | 2017.04.27 |
---|---|
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
Nodejs와 MongoDB (0) | 2017.04.27 |
Node.js와 MySQL (0) | 2017.04.27 |
Express (0) | 2017.04.24 |
: mongoDB용 모듈
: mongodb : MongoDB Nodejs Driver
: Mongoose : ODM
: 드라이버
: mongo 콘솔 클라이언트 명령과 동일하게 조작
: 설치
: npm install mongodb
: 콜랙션 얻기, 따로 변수로 저장해두면 편함
:
socket.io 를 이용한 실시간 웹서비스 (0) | 2017.04.27 |
---|---|
소켓을 이용한 실시간 서비스 (0) | 2017.04.27 |
Node.js와 MySQL (0) | 2017.04.27 |
Express (0) | 2017.04.24 |
RESTful (0) | 2017.04.24 |