Day 16

์™ธ๋ถ€ Security ํŒŒ์ผ ๋“ฑ๋กํ•˜๊ธฐ

ClientRegistrationRepository๋ฅผ ์ƒ์„ฑํ•˜๋ฉด clientId์™€ clientSecret๊ฐ€ ํ•„์ˆ˜์ธ๋ฐ ๋กœ์ปฌ์—์„œ๋Š” application-oauth.properties๊ฐ€ ์žˆ์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ

ํ˜„์žฌ๋Š” EC2์—์„œ ์ง„ํ–‰์ค‘์ด๋ฉด์„œ github์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ๋กœ ํ•˜๋Š”๋ฐ ๋กœ์ปฌ์—์„œ git์— ์˜ฌ๋ฆด ๋•Œ application-oauth.properties๋Š” .gitignore๋กœ ์ œ์™ธ๋Œ€์ƒ์œผ๋กœ ๋นผ๋‘์—ˆ์Œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๊ฐœ๋œ ์ €์žฅ์†Œ์— clientId์™€ ClientSecret์„ ์˜ฌ๋ฆด์ˆ˜๋Š” ์—†์œผ๋‹ˆ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์ด ์„ค์ •๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋„๋ก ํ•ด์•ผํ•จ

app๋””๋ ‰ํ† ๋ฆฌ์— properties ํŒŒ์ผ์„ ์ƒ์„ฑ

vim /home/ec2-user/app/application-aouth.properties

๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑ, ์—ฐ๋‹ค์Œ์— ๋กœ์ปฌ์—์„œ์˜ application-aouth.properties ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ ๋ถ™ํ˜€๋„ฃ๊ธฐ๋ฅผ ํ•˜๊ณ  ์ €์žฅ์ข…๋ฃŒ๋ฅผ ํ•œ๋‹ค์Œ

๋ฐฉ๊ธˆ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•œ application-aouth.properties์„ ์“ฐ๋„๋ก deploy.sh๋ฅผ ์ˆ˜์ •

์ด๊ฒƒ์„ ์ถ”๊ฐ€

nohup java -jar \
        -Dspring.config.location=classpath:/application.
properties,/home/ec2-user/app/application-oauth.properties \
        $REPOSITORY/$JAR_NAME 2>&1 &
  • -Dspring.config.location

    • ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ง€์ •

    • ๊ธฐ๋ณธ ์˜ต์…˜๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” application.properties์™€ OAuth ์„ค์ •๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” application-oauth.properties์˜ ์œ„์น˜๋ฅผ ์ง€์ •

    • classpath๊ฐ€ ๋ถ™์œผ๋ฉด jar ์•ˆ์— ์žˆ๋Š” resources ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ ์ƒ์„ฑ๋จ

    • application-oauth.properties์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉ, ์™ธ๋ถ€์— ํŒŒ์ผ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋กœ RDS ์ ‘๊ทผํ•˜๊ธฐ

RDS๋Š” MariaDB๋ฅผ ์ƒใ…‡์ค‘์ธ๋ฐ ์—ฌ๊ธฐ์„œ ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์ด ํ•„์š”

  • ํ…Œ์ด๋ธ” ์ƒ์„ฑ : H2์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋˜ ํ…Œ์ด๋ธ”๋“ค์„ MariaDB์—์„  ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑ

  • ํ”„๋กœ์ ํŠธ ์„ค์ • : ์ž๋ฐ” ํ”„๋กœ์ ํŠธ๊ฐ€ MariaDB์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— MariaDB์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€

  • EC2(๋ฆฌ๋ˆ…์Šค) ์„ค์ • : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ ‘์† ์ •๋ณด๋Š” ์ค‘์š”ํ•˜๊ฒŒ ๋ณดํ˜ธํ•ด์•ผํ•  ์ •๋ณด์ด๋‹ค. ๋งŒ์•ฝ ๊ณต๊ฐœ๋˜๋ฉด ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ”„๋กœ์ ํŠธ์•ˆ์— ์ ‘์† ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊นƒํ—ˆ๋ธŒ์™€ ๊ฐ™์ด ์˜คํ”ˆ๋œ ๊ณต๊ฐ„์—์„  ๋ˆ„๊ตฌ๋‚˜ ํ•ดํ‚นํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ EC2 ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์ ‘์† ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค์ •

RDSํ…Œ์ด๋ธ”์„ ์ƒ์„ฑ : ์—ฌ๊ธฐ์„œ๋Š” JPA๊ฐ€ ์‚ฌ์šฉ๋  ์—”ํ‹ฐํ‹ฐ ํ…Œ์ด๋ธ”๊ณผ ์Šคํ”„๋ง ์„ธ์…˜์ด ์‚ฌ์šฉ๋  ํ…Œ์ด๋ธ” 2๊ฐ€์ง€ ์ข…๋ฅ˜๋ฅผ ์ƒ์„ฑ

JPA๊ฐ€ ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜ํ–‰์‹œ, ๋กœ๊ทธ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ, schema-mysql.sqlํŒŒ์ผ์—์„œ์˜ ์„ธ์…˜ํ…Œ์ด๋ธ” ์ฟผ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•ด์„œ RDS์— ๋ฐ˜์˜

create table posts (id bigint not null auto_increment, created_date datetime, modified_date datetime, author varchar(255), content TEXT not null, title varchar(500) not null, primary key (id)) engine=InnoDB;
create table user (id bigint not null auto_increment, created_date datetime, modified_date datetime, email varchar(255) not null, name varchar(255) not null, picture varchar(255), role varchar(255) not null, primary key (id)) engine=InnoDB;


CREATE TABLE SPRING_SESSION (
                                PRIMARY_ID CHAR(36) NOT NULL,
                                SESSION_ID CHAR(36) NOT NULL,
                                CREATION_TIME BIGINT NOT NULL,
                                LAST_ACCESS_TIME BIGINT NOT NULL,
                                MAX_INACTIVE_INTERVAL INT NOT NULL,
                                EXPIRY_TIME BIGINT NOT NULL,
                                PRINCIPAL_NAME VARCHAR(100),
                                CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);

CREATE TABLE SPRING_SESSION_ATTRIBUTES (
                                           SESSION_PRIMARY_ID CHAR(36) NOT NULL,
                                           ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
                                           ATTRIBUTE_BYTES BLOB NOT NULL,
                                           CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
                                           CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

ํ”„๋กœ์ ํŠธ ์„ค์ •

๋จผ์ € MariaDB๋“œ๋ผ์ด๋ฒ„๋ฅผ build.gradle์— ๋“ฑ๋ก

compile('org.mariadb.jdbc:mariadb-java-client')

๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์— ๊ตฌ๋™๋  ํ™˜๊ฒฝ์„ ํ•˜๋‚˜ ๊ตฌ์„ฑํ•œ๋‹ค.

src/main/resources์— application-real.propertiesํŒŒ์ผ์„ ์ถ”๊ฐ€

  • application-real.properties๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด profile=real์ธ ํ™˜๊ฒฝ์ด ๊ตฌ์„ฑ๋œ๋‹ค

  • ์‹ค์ œ๋กœ ์šด์˜๋  ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ/๋กœ๊ทธ์ƒ ์ด์Šˆ๊ฐ€ ๋  ๋งŒํ•œ ์„ค์ •๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉฐ RDS ํ™˜๊ฒฝ profile ์„ค์ •์ด ์ถ”๊ฐ€

spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ํ‘ธ์‰ฌ

EC2 ์„ค์ •

OAuth์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ RDS ์ ‘์† ์ •๋ณด๋„ ๋ณดํ˜ธํ•ด์•ผํ•  ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— EC2 ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์ • ํŒŒ์ผ์„ ๋‘”๋‹ค

app ๋””๋ ‰ํ† ๋ฆฌ์— application-real-db.properties ํŒŒ์ผ์„ ์ƒ์„ฑ

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://springboot-book.cjkbpw0rm3r3.ap-northeast-2.rds.amazonaws.com:3306/springboot-bo
ok
spring.datasource.username=kyu9
spring.datasource.password=shim0329
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
  • spring.jpa.hibernate.ddl-auto=none

    • JPA๋กœ ํ…Œ์ด๋ธ”์ด ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์˜ต์…˜์„ None(์ƒ์„ฑํ•˜์ง€ ์•Š์Œ)์œผ๋กœ ์ง€์ •

    • RDS์—์„œ๋Š” ์‹ค์ œ๋กœ ์šด์˜์œผ๋กœ ์‚ฌ์šฉ๋  ํ…Œ์ด๋ธ”์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•จ

    • ์ด ์˜ต์…˜์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ด๋ธ”์ด ๋ชจ๋‘ ์ƒˆ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ

    • ์ฃผ์˜ํ•ด์•ผํ•จ

๋งˆ์ง€๋ง‰์œผ๋กœ deploy.sh๊ฐ€ real profile์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ์ถ”๊ฐ€

nohup java -jar \
        -Dspring.config.location=classpath:/application.properties,/home/ec2-user/application-oauth.properties,
/home/ec2-user/app/application-real-db.properties,classpath:/application-real.properties \
        -Dspring.profiles.active=real \
        $REPOSITORY/$JAR_NAME 2>&1 &
  • Dspring.profiles.active=real

    • application-real.properties๋ฅผ ํ™œ์„ฑํ™”

    • application-real.properties์˜ spring.profiles.include=oauth,real-db ์˜ต์…˜ ๋•Œ๋ฌธ์— real-db ์—ญ์‹œ ํ•จ๊ป˜ ํ™œ์„ฑํ™” ๋Œ€์ƒ์— ํฌํ•จ

์™œ์ž๊พธ

์ด๋ ‡๊ฒŒ ๋œจ๋ฉด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๊ฑธ๊นŒ...

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๊ณ  ./deploy.sh ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ nohup.out ํŒŒ์ผ์„ ์—ด์–ด

Last updated

Was this helpful?