Skip to content

Commit 84b73b9

Browse files
committed
[스프링부트로 웹 서비스 출시하기 - 9. 도메인 구매 및 AWS 연계] 9장 완성!
1 parent d130d6e commit 84b73b9

14 files changed

+168
-32
lines changed

tutorial/9_도메인_SSL설치.md

Lines changed: 168 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
저는 회사에서도 구글 계정으로 모든 처리를 진행하고 있어 연습 삼아 구글 호스팅 서비스를 사용하겠습니다.
77
다른 분들은 좀 더 저렴한 국내 서비스를 쓰셔도 됩니다.
8-
이번 과정부터는 **비용이 직접 청구되니** 당장 서비스하실게 아니라면 꼭 안하셔도 됩니다!
9-
(준비물로 **Master** 혹은 **VISA 카드**가 하나 있어야 합니다.)
8+
이번 과정부터는 **비용이 직접 청구되니** 당장 서비스하실게 아니라면 가장 하단에 있는 **9-4. 타임존 변경**만 진행하셔도 됩니다!
9+
10+
> Tip)
11+
도메인 구매를 진행하신다면 **Master** 혹은 **VISA 카드**가 하나 있어야 합니다.
1012

1113
## 9-1. 도메인 및 서비스 메일 생성
1214

13-
G Suite는 구글에서 제공하는 비지니스 서비스 입니다.
15+
G Suite는 **구글에서 제공하는 비지니스 서비스** 입니다.
1416
회사에서 사용하기 위한 이메일과 도메인, 구글 앱스등을 제공하는데요.
1517
보통 회사에서 업무용 이메일을 구성원들에게 나눠주고, 회사내에서 사용할 문서들을 구글 드라이브에 올려서 사용하는 경우가 많은데요.
1618
이럴때 사용하는 서비스라고 보시면 됩니다.
@@ -262,21 +264,21 @@ p=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
262264
![route21](./images/9/route21.png)
263265

264266
자 이제 다시 G Suite 이메일로 메일을 발송해봅니다.
267+
아래처럼 다시 보낸 메일이 잘 도착하셨나요!?
265268

266269
![route22](./images/9/route22.png)
267270

268-
다시 보낸 메일이 잘 도착하셨나요!?
269-
저희 서비스에 도메인 설정과 서비스 이메일 생성이 완료 되었습니다!
271+
이제는 서비스 도메인과 서비스 이메일 생성이 완료 되었습니다!
270272

271273
## 9-3. HTTPS 연결
272274

273-
도메인 작업이 완료 되었으니, 이번엔 HTTPS를 서비스에 등록해보겠습니다.
274-
HTTPS가 없더라도 서비스에 문제는 없지만, 최근 동향이 **"HTTPS는 기본적으로 갖추자"**이기 때문에 이번 기회에 시작해보시는걸 추천드립니다.
275+
도메인 작업이 완료 되었으니, 이번엔 HTTPS를 서비스에 등록해보겠습니다.
276+
HTTPS가 없더라도 서비스에 문제는 없지만, 최근 동향이 **"HTTPS는 기본적으로 갖추자"** 로 가기 때문에 이번 기회에 시작해보시는걸 추천드립니다.
275277

276278
> Tip)
277279
[HTTPS는 HTTP보다 빠르다](https://tech.ssut.me/2017/05/07/https-is-faster-than-http/),
278280
[구글 "네이버·다음은 왜 https 적용 안하나...크롬에서 경고 표시 띄울 것"](http://biz.chosun.com/site/data/html_dir/2017/02/13/2017021302077.html)
279-
등 웹 사이트에서 HTTPS 사용을 최소한의 기초로 보자는 움직임이 많습니다.
281+
등 웹 사이트에서 HTTPS는 기본적으로 사용하자는 움직임이 많습니다.
280282

281283
> Tip)
282284
HTTP와 HTTPS에 대한 차이점을 알고싶으신 분들은 [HTTP 프로토콜 - joinc](https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/HTTP#s-5.)를 참고하시거나 가장 추천하는 네트워크 교재인 [그림으로 배우는 HTTP & Network Basic](http://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9788931447897)를 읽어보시면 좋습니다!
@@ -288,7 +290,7 @@ HTTP와 HTTPS에 대한 차이점을 알고싶으신 분들은 [HTTP 프로토
288290
특히 Let's Encrypt 설치 및 업데이트를 쉽게 해주는 certbot이 등장해서 사용하기도 굉장히 수월해졌습니다.
289291

290292
* [certbox](https://certbot.eff.org/#centosrhel6-nginx)
291-
* [Amazon Linux에서 Certbot의 Let's Encrypt](https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/SSL-on-an-instance.html#letsencrypt)
293+
* [Amazon Linux에서 Apache + Certbot의 Let's Encrypt](https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/SSL-on-an-instance.html#letsencrypt)
292294

293295
여기선 Amazon Linux 2017.09 버전의 EC2로 진행됩니다.
294296
만약 본인의 서버 혹은 EC2의 버전이 다르시다면 위 링크를 참고해서 설치를 진행하셔도 됩니다.
@@ -311,62 +313,196 @@ wget https://dl.eff.org/certbot-auto
311313
chmod a+x certbot-auto
312314
```
313315

314-
sudo로 ```--debug``` 옵션을 주어 설치파일을 실행합니다.
316+
그럼 이제 certbot을 통해 Nginx에 HTTPS를 설정하겠습니다.
315317

316-
```bash
317-
sudo ./certbot-auto --debug
318-
```
319-
320-
"Is this ok [y/d/N]"가 나오면 "y"를 입력하고 기다립니다.
321-
"Enter email address (used for urgent renewal and security notices)"가 나오면 Email 주소를 입력하라는 메세지이니, 본인의 Email주소를 입력하시면 됩니다.
322-
"(A)gree/(C)ancel"가 나오면 Let's Encrypt 서비스 계약 조건에 동의여부를 묻는것이니, A를 입력합니다. (동의)
323-
324-
![ssl1](./images/9/ssl1.png)
318+
> Tip)
319+
모든 과정은 아래 이미지로 전부 캡쳐했으니 그걸 보셔도 무방합니다.
325320

326-
AWS에서
321+
다음의 명령어를 입력합니다.
327322

328323
```bash
329-
sudo vi /etc/nginx/nginx.conf
324+
sudo /home/ec2-user/certbot-auto --nginx
330325
```
331326

332-
```bash
333-
sudo nginx -t
334-
```
327+
명령어가 실행되면 몇가지가 수행되다가 도메인 입력을 하라는 메세지가 나옵니다.
335328

336329
```bash
337-
sudo service nginx reload
338-
sudo service nginx stop
330+
No names were found in your configuration files. Please enter in your domain
331+
name(s) (comma and/or space separated) (Enter 'c' to cancel):example.com www.example.com
339332
```
340333

334+
여기서 example.com과 www.example.com은 우리 서비스의 도메인을 얘기합니다.
335+
저는 ```springboot-webservice.com``````www.springboot-webservice.com```으로 입력했습니다.
336+
다음으로 웹 서버에 보안성이 낮은 연결을 허용할지를 선택합니다.
337+
예제에 나와 있는 것과 같이 옵션 2를 선택하면 모든 서버 연결이 HTTPS로 연결됩니다.
338+
(저는 2를 선택했습니다.)
339+
341340
```bash
342-
wget https://dl.eff.org/certbot-auto
343-
chmod a+x certbot-auto
344-
sudo ./certbot-auto --nginx
341+
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
342+
-------------------------------------------------------------------------------
343+
1: No redirect - Make no further changes to the webserver configuration.
344+
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
345+
new sites, or if you're confident your site works on HTTPS. You can undo this
346+
change by editing your web server's configuration.
347+
-------------------------------------------------------------------------------
348+
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
345349
```
346350
347-
### Let's Encrypt 인증서 자동 갱신 등록
351+
이렇게 하시면! 모든 설정이 완료 됩니다!
352+
353+
![ssl2](./images/9/ssl2.png)
354+
355+
자 한번 우리 서비스를 다시 접속해볼까요?
356+
357+
![ssl3](./images/9/ssl3.png)
358+
359+
와우! 서비스에 https가 적용되었습니다!
360+
이제 보안도 챙기고, 크롬브라우저에서 저희 서비스가 경고메세지가 출력될일도 없겠죠?
361+
362+
### 9-3-2. Let's Encrypt 인증서 자동 갱신 등록
363+
364+
SSL 인증서 설치는 끝이났습니다!
365+
여기서 실제 서비스로 이용해야할때 한가지 작업이 더 필요합니다.
366+
바로 인증서 자동 갱신입니다.
367+
아래처럼 Let's Encrypt는 인증서가 3개월이면 만료가 됩니다.
368+
369+
![ssl4](./images/9/ssl4.png)
370+
371+
3개월마다 인증서를 갱신해야하는데, 이걸 사람이 직접 하기엔 귀찮은 작업이 됩니다.
372+
그래서 이 인증서 갱신을 자동화 시키겠습니다.
373+
보통 이렇게 리눅스 서버에 스케줄 작업을 걸때 crontab을 많이 사용합니다.
374+
375+
> Tip)
376+
crontab(크론탭)의 설명은 [제타위키](https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab)가 가장 잘되어있기 때문에 한번 읽어보시면 금방 이해되실것 같습니다.
377+
378+
그럼 crontab에 인증서 갱신 작업을 등록하겠습니다.
379+
아래 명령어로 crontab 편집창을 열고,
348380
349381
```bash
350382
crontab -e
351383
```
352384
385+
다음의 코드를 등록합니다.
386+
353387
```bash
354388
# Begin Let's encrypt renew
355-
0 4 1 */3 * /bin/bash -l -c '/home/ec2-user/certbot-auto renew --quiet --no-self-upgrade'
389+
0 4 1 */3 * /bin/bash -l -c '/home/ec2-user/certbot-auto renew'
356390
# End Let's encrypt renew
357391
```
358392

359-
### 인증서 갱신 중 오류 발생시
393+
![ssl5](./images/9/ssl5.png)
394+
395+
등록한 시간은 **3개월에 1번씩 새벽 4시**에 수행한다는 내용입니다.
396+
397+
> Tip)
398+
[crontab.guru](https://crontab.guru/#0_4_1_*/3_*)을 통해 수행 주기를 확인할 수 있습니다.
399+
400+
vi에서 저장할때와 마찬가지로 ```:wq```로 저장 & 종료하면 crontab이 정상적으로 등록됩니다!
401+
402+
### 9-3-3. 인증서 갱신 중 오류 발생시
403+
404+
만약 인증서 갱신 도중 오류가 발생하시면 아래 명령어를 차례로 입력하시면 됩니다.
405+
기존의 certbot으로 설치된 내용들을 삭제하신뒤,
360406

361407
```bash
362408
sudo rm -rf /root/.local/share/letsencrypt/
363409
sudo rm -rf /opt/eff.org/certbot/
364410
```
365411

412+
다시 갱신을 시도합니다.
413+
366414
```bash
367415
/home/ec2-user/certbot-auto renew -v --debug
368416
```
369417

418+
## 9-4. 타임존 변경
419+
420+
이 시간은 crontab 편에 이어서 진행됩니다.
421+
EC2를 처음 설치하게 되면 타임존이 UTC가 됩니다.
422+
423+
![timezone1](./images/9/timezone1.png)
424+
425+
현재 시간이 UTC로 되어있어, 모든 서버 관련 데이터가 한국시간 보다 9시간 차이가 납니다.
426+
이는 데이터베이스에서도 마찬가지인데요.
427+
RDS도 기본 UTC인지라 아래와 같이 시간이 출력됩니다.
428+
(캡쳐 당시 **한국시간은 2/17일 15시**였습니다.)
429+
430+
![timezone2](./images/9/timezone2.png)
431+
432+
그래서 EC2와 RDS의 타임존을 KST(한국시간)으로 변경하겠습니다.
433+
434+
### 9-4-1. EC2 타임존 변경
435+
436+
아래명령어를 EC2에서 차례로 입력합니다.
437+
438+
```bash
439+
sudo rm /etc/localtime
440+
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
441+
date
442+
```
443+
444+
![timezone3](./images/9/timezone3.png)
445+
446+
최종 반영을 위해 EC2를 한번 부팅합니다.
447+
448+
```bash
449+
sudo reboot
450+
```
451+
452+
부팅후 10분뒤에 다시 재접속해서 시간을 확인해보시면!
453+
454+
```bash
455+
date
456+
```
457+
458+
![timezone4](./images/9/timezone4.png)
459+
460+
정상적으로 반영되었습니다!
461+
462+
### 9-4-2. RDS 타임존 변경
463+
464+
이제는 RDS의 타임존을 변경하겠습니다.
465+
먼저 RDS의 파라미터 그룹으로 이동합니다.
466+
해당 RDS를 선택후, **파라미터 편집**을 선택합니다.
467+
468+
![timezone5](./images/9/timezone5.png)
469+
470+
필터에 ```time_zone```을 입력해 **time_zone** 파라미터를 찾습니다.
471+
472+
![timezone6](./images/9/timezone6.png)
473+
474+
**time_zone** 값을 **Aisa/Seoul**을 선택합니다.
475+
**변경 사항 저장**을 클릭해 최종 저장합니다.
476+
477+
![timezone7](./images/9/timezone7.png)
478+
479+
그럼 RDS가 수정작업을 진행합니다.
480+
481+
![timezone8](./images/9/timezone8.png)
482+
483+
수정 작업이 끝난후, DB 툴을 통해 아래 쿼리를 실행해보시면!
484+
485+
```sql
486+
select @@time_zone, now();
487+
```
488+
489+
타임존이 변경된 것을 확인할 수 있습니다!
490+
491+
![timezone9](./images/9/timezone9.png)
492+
493+
RDS도 정상적으로 한국 시간이 반영되었습니다!
494+
495+
## 마무리
496+
497+
**하나의 서비스를 개발하는 모든 과정을 진행**했습니다!
498+
어떠셨나요!?
499+
단순히 localhost:8080만 진행할때와는 전혀 다른 어려움이 많지 않으셨나요?
500+
그래도 이제는 **본인의 힘으로 하나의 서비스를 구축**할수 있게 되었습니다.
501+
다음은 이번 시리즈의 마지막 챕터가 되겠습니다.
502+
**서비스를 구축할때 미리 알았으면 좋았을 법한 팁**들을 모아 공유드릴 예정입니다.
503+
마지막까지 잘 부탁드리겠습니다!
504+
고맙습니다^^
505+
370506
## 참고
371507
372508
* [Email 연결](https://blog.andrewray.me/setting-up-gsuite-gmail-custom-domains-with-aws-route53/)

tutorial/images/9/ssl2.png

3.1 MB
Loading

tutorial/images/9/ssl3.png

130 KB
Loading

tutorial/images/9/ssl4.png

166 KB
Loading

tutorial/images/9/ssl5.png

178 KB
Loading

tutorial/images/9/timezone1.png

652 KB
Loading

tutorial/images/9/timezone2.png

30.8 KB
Loading

tutorial/images/9/timezone3.png

268 KB
Loading

tutorial/images/9/timezone4.png

198 KB
Loading

tutorial/images/9/timezone5.png

215 KB
Loading

tutorial/images/9/timezone6.png

223 KB
Loading

tutorial/images/9/timezone7.png

207 KB
Loading

tutorial/images/9/timezone8.png

330 KB
Loading

tutorial/images/9/timezone9.png

45 KB
Loading

0 commit comments

Comments
 (0)