-
์ค๋งํธ ์นดํธ ์ค๊ณ๊ธฐ (2) - ์น ์๋น์ค ์ฝ๋ฉ์ ์์Soliloquy 2020. 12. 25. 00:01
๐จ
์น ์๋น์ค ์ฝ๋ฉ์ ์์
๋ด๊ฐ ๋งก๊ฒ ๋ ๊ธฐ๋ฅ๋ค ์ค ์น ์๋น์ค ์ฝ๋ฉ์ ๋จผ์ ๊ตฌํํ๊ธฐ ์์ํ๋ค. ์๋ฌด๋๋ ์์ ์ฒ์ ๋ณด๋ NFC๋ณด๋ค๋ ์น์ฌ์ดํธ ๊ตฌํ์ด ๋ ์ฝ๊ธฐ๋ ํ๊ณ , ๋ณธ ์ํ์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
Flask์ ํ์ฉ
์น ๊ฐ๋ฐ์ ํ๊ธฐ ์ํด์๋ ์ฐ์ ์ด๋ ํ ํ๋ก๊ทธ๋จ์ผ๋ก ์น ์๋น์ค๋ฅผ ๊ตฌํํด์ผ ํ ์ง ์ ํด์ผ ํ๋ค. ๊ณผ๊ฑฐ Flask๋ฅผ ์ด์ฉํ์ฌ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ฅผ ์กฐ์ํ๋ ํน๊ฐ์ ๋ฐ์ ์ ์ด ์์ด์, ์น์๋ฒ ๊ตฌ๋ ํ๋ก๊ทธ๋จ์ผ๋ก Flask๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
๋น๋ก ์ฝ 6๊ฐ์๋ ๋ ๋ ๊ธฐ์ต ์์์ ๋น์์ Flask์ฌ์ฉ ๊ธฐ์ต์ ๊ทธ๋ ๊ฒ ๋ง์ด ๋ ์ค๋ฅด์ง ์์์ง๋ง, ์ฌ์ฉ ์ธ์ด๊ฐ ๋๋ฆ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธ์ด์ค ํ๋์ธ Python์ด์๊ณ , ์ธํฐ๋ท์๋ ์ด๋ฏธ ์๋ง์ ์์ ๊ฐ ๋์ ์์ด์ ์ฌ์ฉ์ ํฐ ๋ฌด๋ฆฌ๋ ์์๋ค. Flask๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ฉด ์ถฉ๋ถํ๊ฒ ๋ค๋ ํ์ ์ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ์น ์ฌ์ดํธ์ ํน์ง์ ๋จผ์ ์ ํ ํ, ํ ์ผ๋ค์ ์ฐจ๋ก๋๋ก ๊พธ์คํ ํด ๋๊ฐ๋ค.
์ฌ๋ด์ด์ง๋ง, ์ด๋ฒ์๋ ์์ ์ ์งํํ๋ฉด์ ์ฝ๋๊ฐ ์ ์ ๋ณต์กํด์ ธ์ ํน์๋ ๋ชจ๋ฅผ ์ฌ๊ณ ์ ๋๋นํด ์ฌํ๊ป ์ ์ฌ์ฉํด๋ณด์ง ๋ชปํ๋ ๊นํ๋ธ๋ ์ฌ์ฉํด ๋ณด์๋ค. ํน์ ๊ธฐ๋ฅ์ด ๋ง๋ค์ด์ง ๋๋ง๋ค ๋ธ๋ฐ์น๋ฅผ ๋ง๋ค์๋ค. ์ต์์ง ์์ ๊นํ๋ธ์์ง๋ง, ์ฝ๋๊ฐ ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ๊ฐ๋ค๋ ๊ธฐ๋ถ์ด ๋ค์ด์ ์ข์๋ค.
์ค๊ณํ ์น ์ฌ์ดํธ์ ํน์ง
์น ์ฌ์ดํธ๋ฅผ ์ค๊ฒ ํ๊ธฐ ์ , ๋ด๊ฐ ์ค๊ณํ ์น ์ฌ์ดํธ์ ํน์ง์ ๋ค์ ํ๋ฒ ์ดํด๋ณด์๋ค.
- ์ค๋งํธ ์ผํ ์นดํธ๋ ๋ํ ๋งํธ์์ ์ด์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ํ ๋งํธ์ ๋ฌผ๊ฑด๋ค์ ํ์ํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ํ์์ฑ์ด ์๋ค.
- IoT์ ํ์์ ์ธ ๊ธฐ๋ฅ ์ค ๋ณด์์ฑ์ ์ํด์ ์ํธํ ๊ธฐ์ ์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
- ์ค์ง NFC์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด์ ์ ์์ ํ๋ฉฐ MAC ์ฃผ์ ๋ฑ์ผ๋ก ์ฅ์น๋ฅผ ๊ตฌ๋ถํ๊ธฐ ํ๋๋ฏ๋ก, ๋ค์ค ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์๋ค์ ์ ์ฉ์ ๋ง์ ์ฅ์น๊ฐ ํ์ํ๋ค.
- ์น ์ฌ์ดํธ๋ Wi-Fi๋ LTE๋ฑ์ ์ ๋ฃฐ๋ฌ ๋คํธ์ํฌ๋ฅผ ํตํ ์ธ๋ถ์์ ์ ์์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์ฌ์ดํธ๋ ์ฒ์ ๋ณด๋ ์ฌ๋๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ์ ๋๋ก ๊ฐ๊ฒฐํ๊ณ ๊น๋ํด์ผ ํ๋ค.
๋ด๊ฐ ์๊ฐํ๋ ์น ์ฌ์ดํธ์ ํน์ง ๋ฐ ๊ธฐ๋ฅ
Flask์ Database
ํ๊ต์์ Database ๊ด๋ จ ์์ ์ ๊ฑฐ์ ๋ค์ด๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์, ๋งค์ผ ๋ฐค 9์๋ถํฐ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ์ธํฐ๋ท์ ์์ ๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ํ๋์ฉ ์์ฑํด ๋๊ฐ๋ค. Flask๋ ๋คํํ Database ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ Flask-SQLAlchemy๋ผ๋ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ์๊ณ , ๋์๊ฒ ํ์ํ ์ค๋ช ์ด๋ ์์ ๋ฅผ ์ธํฐ๋ท์์ ์ฝ๊ฒ ์ฐพ์ ์ ์์๋ค. 1
๋ณธ ์ค๋งํธ ์ผํ์นดํธ ์น ์๋น์ค์์ ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํญ๋ชฉ์ ์๋์ ๊ฐ์๋ค.
- ID: ๊ธฐ๋ณธ ํค
- productname: ๋ฌผํ ์ด๋ฆ
- company: ๋ฌผํ ์ ์กฐ์ฌ๋ช
- locationx: ๋ฌผํ์ x์์น
- locatoiny: ๋ฌผํ์ y์์น
- locationz: ๋ฌผํ์ z์์น 2
- price: ๋ฌผํ์ ๊ฐ๊ฒฉ
- status: ๋ฌผํ์ ์ํ (ํ์ ์ธ์ง, ํ ์ธ ์ค์ธ์ง…)
#DB ์์ฑ์ ์ํ ๊ตฌ๋ฌธ class storeproduct(db.Model): __table_name__ = 'storeproduct' id = db.Column(db.Integer, primary_key=True) productname = db.Column(db.String) company = db.Column(db.String, nullable=True) locationx = db.Column(db.Integer, nullable=True) locationy = db.Column(db.Integer, nullable=True) locationz = db.Column(db.Integer, nullable=True) price = db.Column(db.Integer, nullable=True) status = db.Column(db.String, nullable=True) def __init__(self, productname, locationx, locationy): self.productname = productname self.locationx = locationx self.locationy = location
DBํด๋์ค ์ค ์ผ๋ถ
Flask-SQLAlchemy๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ๋ง๋ค๊ณ , ์ฝ 1์ฃผ์ผ์ ๊ฑธ์ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํญ๋ชฉ์ ์ถ๊ฐ ๋ฐ ์์ ํ๋ ํ์ด์ง๋ฅผ ๋ง๋ค์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ถ๊ฐ ๋ฐ ์์ ํ๋ ํ์ด์ง๋ HTTP REST๋ผ๋ ๊ธฐ์ ์ ์ด์ฉํด์ผ ํ๋ค. ๋๋ ์ธํฐ๋ท์ ๋ ๋์๋ค๋๋ ์์ ๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฒ์ ๊ธฐ๋ฅ์ HTTP Post๋ก ๊ตฌํํ์๋ค.
์ฌ๋ด์ผ๋ก, ์ฌ๊ธฐ์ ์ป์ HTTP REST์ ๊ดํ ์ง์์ ๋์ค์ NFC์ URL ์ ์ก ๊ธฐ๋ฅ์ ์ด์ฉํ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๋ง๋๋๋ฐ ๋ง์ ๋์์ด ๋์๋ค.
์ฒ์ ๋ง๋ ๊ฒ์ ์นํ์ด์ง์ ๋ชจ์ต๋ค
์นํ์ด์ง ์ ์ก ์ํธํ
๋ด๊ฐ ์ค๊ณํ ์ค๋งํธ ์ผํ ์นดํธ ์น ํ์ด์ง๋ ์ํธํ๊ฐ ๋์ด ์์ง ์์ ๋งํธ ๋ด ๊ณต๊ฐ๋ Wi-Fi์์๋ ์ฌ์ฉ๋ ์ ์์๋ค. ๊ณต๊ฐ๋ Wi-Fi๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ 3์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ก์ฑ๊ฑฐ๋ ์น์ฌ์ดํธ๋ฅผ ๋ณ์กฐ์ํค๋ฉด ์ฌ๋ฌ๋ชจ๋ก ํฐ ํผํด๊ฐ ๋ฐ์ํ ์๋ ์์ ๊ฒ์ด๋ผ ์๊ฐํ์๊ณ , ๊ทธ์ ๋ง๋ ์ธ์ฆ ๋ฐ ์ํธํ ๊ธฐ์ ์ ์ถ๊ฐํ๊ธฐ๋ก ํ๋ค.
์ด๋ป๊ฒ ์ํธํ ๊ธฐ์ ์ ์ ์ฉํ ์ง ์ ์ฐจ๋ก์ ๊ณ ๋ฏผ ์ค, HTTPS๋ผ๋ ์ํธํ ํต์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์ด๋ ์ ๋ ํด๊ฒฐ๋ ์ ์๋ค๋ ๊ฒ์ ์๊ฐํด ๋ด์๋ค. ํ์ง๋ง, HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ค๋ฉด ์น์ฌ์ดํธ๊ฐ ์ฌ๊ธฐ ์ฌ์ดํธ๊ฐ ์๋ ์ค์ ์น์ฌ์ดํธ ์์ ์ฆ๋ช ํ๋ SSL ์ธ์ฆ์๋ผ๋ ๊ฒ์ด ํ์ํ๋ค.
๊ทธ๋ฐ๋ฐ SSL ์ธ์ฆ์๋ ๊ณต์ธ๋ ๊ธฐ๊ด์์ ๋ฐ๊ธ๋ ๊ฒ์ด ์๋ ๊ฐ์ธ์ด ์ง์ ๋ง๋ ์ธ์ฆ์๋ ์น ์ฌ์ดํธ ์ ์ ์ ์น ๋ธ๋ผ์ฐ์ ์์์ ์ธ์ฆ์ ํ์ธ ๋ถ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์, ๊ณต์ธ๋ ๊ณณ์์ ์ฌ์ฉํด์ผ ํ๋ค. ๋น๋ก ๊ฒฝ๊ณ ์ฐฝ์ด ๋ฐ์ํด๋ ์น ์ฌ์ดํธ ์ฌ์ฉ์ ํฐ ๋ฌธ์ ๋ ์์ง๋ง, ์ 3์๊ฐ ์ฌ์ฉํ๊ธฐ์๋ ์ ๊ทผ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ณต์ธ๋ ๊ธฐ๊ด์ ์ธ์ฆ์๊ฐ ํ์ํ๋ค.
โ ๏ธWarning: Potential Security Risk Ahead
Firefox detected a potential security threat and did not continue to 127.0.0.1. If you visit this site, attackers could try to steal information like your passwords, emails, or credit card details.
127.0.0.1:5000 uses an invalid security certificate.
The certificate is not trusted because it is self-signed.
Error code: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERTOpenSSL๋ก ๋ง๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ํ๋๋ ๊ฒฝ๊ณ
๊ณต์ธ ๊ธฐ๊ด์์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ ๋ฐ๊ธฐ ์ํ ๋ ธ๋ ฅ
๊ณต์ธ๋ ๊ธฐ๊ด์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ธฐ ์ํด์ ์๋์ ๋ ๊ฐ์ง๊ฐ ํ์ํ๋ค.
- ์น ์ฌ์ดํธ ๋๋ฉ์ธ
- ์ธ์ฆ์ ๋ฐ๊ธ ๋น์ฉ
๊ธฐ๋ณธ์ ์ผ๋ก SSL ์ธ์ฆ์๋ ์ฌ์ดํธ ๋๋ฉ์ธ์ ๊ธฐ์ค์ผ๋ก ๋ฐ๊ธ์ด ๋์๋ค. ์๋ฅผ ๋ค๋ฉด www.naver.com ์ด๋ www.google.com ๊ณผ ๊ฐ์ ์น ์ฌ์ดํธ์ ์ฃผ์๋ฅผ ์์ ํ๊ณ ์๋ค๋ฉด ํด๋น ๋๋ฉ์ธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ฆ์๋ฅผ ํ๋งคํ๋ค.
๋๋ฉ์ธ์ ์ฌ๋ฉด ๋์ง ์๊ฒ ๋๋? ๋ผ๊ณ ์๊ฐ์ด ๋์์ง๋ง, ์ํ๊น๊ฒ๋ ์กธ์ ์ํ ์ง์๊ธ์๋ ์ค๋ฌผ์ด ์๋ ๋ฌผ๊ฑด์ ๊ตฌ๋งค๋ฅผ ์ ํํ๊ณ ์์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ธํฐ๋ท์์ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ ๋ฌด๋ฃ ๋๋ฉ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋จ๊น? ๋ผ๋ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ์ง๋ง, ๋ฌด๋ฃ ๋๋ฉ์ธ์ ๋ญ๊ฐ ๋ดํค์ง ์์๋ค. ๋๋ฉ์ธ์ด ์ธ์ ์ฌ๋ผ์ง์ง ๋ชจ๋ฅด๋ ๋ถ์๊ฐ, ๋๋ฉ์ธ์ ๋ฌด๋ฃ๋ก ๋ฐ์๋ DNS ๋ฑ๋ก ๋น์ฉ์ ๋ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค๋ ์ ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ์ DNS ๋ฑ๋ก์ด ๋ฌด๋ฃ๋ผ๊ณ ํ๋๋ผ๋ ์น ์ฌ์ดํธ ๋ด์ ๋ถํ์ํ ๊ด๊ณ ๋ฑ์ ์์๊ฐ ์ฝ์ ๋ ๊ฒ ๊ฐ๋ค๋ ์ ์ด์๋ค.๊ฒฐ๊ตญ ์ฌ๋น๋ก ๋๋ฉ์ธ์ ๊ตฌ์ ํ๋ ๊ฒ์ด ์ข์๊น? ๋ผ๋ ์๊ฐ๋ ๋ค์๋ค.
ํ์ง๋ง, ๋ป๋ฐ์ ๊ณณ์์ ๋๋ฉ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๋ฐ๊ฒฌํ๋ค. ๋ด๊ฐ ๋ฐ๊ฒฌํ ๋ฐฉ๋ฒ์ NAS ๊ธฐ๋ฅ์ด ํ์ฌ๋ ์์ดํผํ์ ๊ณต์ ๊ธฐ์ ๋ฌด๋ฃ DDNS ๋๋ฉ์ธ์ ์ด์ฉํ ๋ฐฉ๋ฒ์ด์๋ค.
NAS ๊ธฐ๋ฅ์ด ํ์ฌ๋ ์์ดํผํ์ ๊ณต์ ๊ธฐ๋ ipdisk.co.kr ์ด๋ผ๋ NAS ์ ์ ์ฃผ์๋ฅผ ๋ฐ์ ์ ์๋๋ฐ, ํด๋น ์ฃผ์๋ ์ฌ์ฉ์ ์ถ๊ฐ์ ์ธ ๋น์ฉ์ด ์ ํ ๋ค์ง ์์๋ค. NAS ์ ํ์ ํ๋ ํ์ฌ์ DDNS์ด๋ ๋ฏฟ์ ์ ์๋ ๋๋ฉ์ธ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ์ด๋ ๊ฒ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ํด๊ฒฐ์ด ๋๋ค.
์ด์ ๋จ์ ๊ฒ์ ๋ ๋ฒ์งธ ๋ฌธ์ ์ธ ์ธ์ฆ์๋ฅผ ๊ตฌ๋งคํ ๋น์ฉ์ ๊ดํ ๊ฒ์ด์๋ค. ๋๋ฉ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ฆ์ ๋ํ ์กธ์ ๊ณผ์ ์ํ ์ ์ ์ง์๊ธ์ผ๋ก ๊ตฌ๋งค ๋ถ๊ฐ๋ฅํ ํ๋ชฉ์ด์๋ค. ๋ฐ๋ผ์, ๋ฌด๋ฃ ์ธ์ฆ์๋ฅผ ์ฐพ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ์๊ฐํ๋ค. ์ธํฐ๋ท ๊ฒ์์ ํด ๋ณธ ๊ฒฐ๊ณผ ๋ด๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ฌด๋ฃ ์ธ์ฆ์๋ ํฌ๊ฒ 2๊ฐ์ง๋ก Let’s Encrypt๋ผ๋ ๊ธฐ๊ด, ๋๋ ZeroSSL.com ์ด๋ผ๋ ๊ธฐ๊ด์์ ๋ฐ๊ธ์ ๋ฐ์ผ๋ฉด ๋๋ค.
Let's Encrypt ์ฌ์ฉ๊ธฐ
๋ ๊ฐ์ง์ ๊ธฐ๊ด ์ค, ์ฒซ ๋ฒ์งธ๋ก ์๋ํด๋ณธ ๊ฒ์ Let's Encrypt์๋ค. ์ด์ ๋ ์ธํฐ๋ท์ ๋์๋ค๋๋ฉด์ Let’s Encrypt ์ธ์ฆ์๋ฅผ ์ข ์ข ๋ด์๋๋ฐ, ์ฌ์ดํธ ์ ์ ์ ๋ณ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๊ฒฝํํด๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ๋ง์ด ์ฌ์ฉ๋๋ค๊ณ ํ๋, ๋ญ๊ฐ ์จ๋ณด๊ณ ์ถ์๊ธฐ๋ ํ๋ค.
ํ์ง๋ง ํด๋น ๊ธฐ๊ด์์ ์ธ์ฆ์๋ฅผ ๋ฐ๋๋ฐ์ ์คํจํ๋ค. Let’s Encrypt๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์น์ฌ์ดํธ ์ธ์ฆ์ ํด์ผ ํ๋๋ฐ, ์ธ์ฆ์ ํ์ํ ํ๋ก๊ทธ๋จ์ธ Win-acme๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃฐ์ง ๋ชฐ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒฐ๊ตญ ํ์ฐธ์ ํค๋งค๋ค๊ฐ ๊ฒฐ๊ตญ ํฌ๊ธฐํ๋ค.
A simple Windows ACMEv2 client (WACS)
Software version 2.1.7.807 (RELEASE, PLUGGABLE)
ACME server https://acme-v02.api.letsencrypt.org/
IIS not detected
Running without administrator credentials, some options disabled
Scheduled task not configured yet
Please report issues at https://github.com/win-acme/win-acmeN: Create renewal (default settings)
M: Create renewal (full options)
R: Run renewals (0 currently due)
A: Manage renewals (1 total)
O: More options...
Q: QuitPlease choose from the menu:
Win-acme์ ์คํ ๋ชจ์ต (๋ณธ ํ๋ฉด์ ๋ฐ๊ธ์ ๋ฐ๊ณ ๋ ๋ค์ ๋ชจ์ต์ด๋ค)
๊ทธ๋์ ๋ ๋ฒ์งธ ์ ํ์ง์ธ ZeroSSL.com์ ์ด์ฉํ์ฌ ๋๋ฉ์ธ ์ธ์ฆ์ ๋ฐ๊ธํ๋ค. ZeroSSL.com์ Win-acme๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์๋, ZeroSSL.com ๋ด์์ ์์ฒด์ ์ผ๋ก ์ธ์ฆ์ ๋ฐ์ ์ ์๋๋ก ์ค๋ช ์ด ๋์ด ์์ด์ ํจ์ฌ ์ฌ์ ๋ค. ๊ทธ๋ ๊ฒ ZeroSSL.com ์ธ์ฆ์๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ๊ณ Flask ๊ฐ๋ฐ ์๋ฒ์ ์ ์ฉ์ํฌ ์ ์์๋ค.
ํ์ง๋ง, ๊ธฐ์จ๋ ์ ์, ํฌ๋กฌ์์๋ ์ธ์ฆ์์ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ํ์ด์ดํญ์ค์์๋ ํด๋น ์ธ์ฆ์์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉฐ ํ์ด์ง ๊ฒฝ๊ณ ํ์๋ฅผ ๋์ ๋ค. ํด๋น ์ธ์ฆ์์ ์๋ชป๋ ๋ถ๋ถ์ด ์๋ค๋ ๋ฉ์์ง๊ฐ ๋์๋๋ฐ, ์ธํฐ๋ท์์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๋ค.โ ๏ธ
๋๋ถ๋ถ ํฌ๋กฌ์ ๋ง์ด ์ฌ์ฉํ๋ ํ์ด์ดํญ์ค๋ ์์ธ๋ก ๋๋ ๊ฒ์ด ๋ซ์ง ์์๊น? ๋ผ๋ ์๊ฐ์ ์ฌ๋ฌ ๊ณ ๋ฏผ์ ํ๋ค๊ฐ, ์ด์ ์ด๋ ๊ฒ ๋ ๊น์ Let’s Encrypt๋ฅผ ์ด์ฉํ๊ธฐ๋ก ์ ํ์๊ณ , Win-acme ์ฌ์ฉ์ ๋ฐฐ์๋ณด๊ธฐ๋ก ํ๋ค. Let’s Encrypt๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฝ 3์ผ ๋์ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง ์ ๋ณด๋ฅผ ์ฐพ๋ค๊ฐ, ๊ฒฐ๊ตญ ์น์๋ฒ ๊ตฌ๋ ํ๋ก๊ทธ๋จ์ธ ์๋์ฐ์ฉ Ngix์ ๊ณต์ ๊ธฐ์ ํฌํธ ํฌ์๋ฉ์ ์ด์ฉํด์ ์ธ์ฆ์ ์ฑ๊ณตํ๋ค.๋ด๊ฐ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ๊ณต์ ๊ธฐ์ ํฌํธ ํฌ์๋ฉ์ผ๋ก 80๋ฒ ํฌํธ๋ฅผ Ngix ์๋ฒ PC๋ก ํฌ์๋ฉํด์ฃผ๊ณ , Win-acme๋ก ์ธ์ฆ ์ต์ ์ค ‘1: [http-01] Save verification files on (network) path’ ๋ฅผ ์ ํํ ๋ค Ngix ์ค์น ํด๋์ ์น ์ฌ์ดํธ ์ต์ ํด๋๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋์๋ค.
์ฌ๋ด์ด์ง๋ง ์ด๋ ๊ฒ ZeroSSL.com์ Let’s Encrypt๋ก ๋ฐ๊พผ ๊ฒ์ ์ ๋ง ์ข์ ์ ํ์ด์๋ค. ํ์ ์๊ฒ ๋ ์ฌ์ค๋ก, Let's Encrypt์ ZeroSSL.com์ ์ฌ์ฉํ๋ ค๋ ๋๋ฉ์ธ์ CAA record์ Let's Encrypt ๊ด๋ จ ๋ฌธ๊ตฌ๋ฅผ ๋ฑ๋กํด์ค์ผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฐ๋์๋ค. ํ์ง๋ง, ipdisk.co.kr ๋๋ฉ์ธ์๋ ํด๋น CAA record๊ฐ ๋ฑ๋ก๋์ด ์์ง ์๊ณ , ์ฌ์ฉ์๊ฐ ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ ๊ฒฐ๊ตญ ๋ฌด๋ฃ SSL ๋ฐ๊ธ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ผ๋ฒ๋ ธ๋ค. 3
์ด์ฐ ๋๋ , ์ฐ์ฌ๊ณก์ ๋์ ์ด๋ ๊ฒ HTTPS ์์ ์ด ๋๋ฌ๋ค.
app.run( debug=testmode, ssl_context=('cert.pem', 'key.pem'), host='0.0.0.0', port=5000 )
Flask ๊ฐ๋ฐ ์๋ฒ์์ HTTPS๋ฅผ ์ ์ฉ์ํจ ๋ชจ์ต
์ฌ์ฉ์๋ค์ ์ ์ฉ์ ๋ง์ ์ฅ์น
์ฌ์ฉ์๋ค์ ์ ์ฉ์ ๋ง๊ธฐ ์ํด ์๋์ ๊ฐ์ด 2๊ฐ์ง๋ฅผ ๊ตฌ์ํ์๋ค.
- ๋ก๊ทธ์์ ๊ธฐ๋ฅ๊ณผ ์ผํ์ฉ ์ํธ ์์ฑ ๋ฐ ์ธ์ฆ ๋ฐฉ๋ฒ
- ์ต๋ ์ฌ์ฉ์ ์ ์ ํ ๋ฐฉ๋ฒ
์ด๊ธฐ ๊ตฌ์ํ ๋ก๊ทธ์์ ๊ธฐ๋ฅ๊ณผ ์ผํ์ฉ ์ํธ ์์ฑ ๋ฐ ์ธ์ฆ ๋ฐฉ๋ฒ ์ค ์ผํ์ฉ ์ํธ ์์ฑ ๋ฐฉ๋ฒ์ Python์ ํตํด ๋ฌด์์ ๋ฌธ์์ ์ซ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ํตํด ๋ง๋๋ ๋ฐฉ์์ด์๋ค. ๊ทธ๋ฆฌ๊ณ ์ํธ ์ฝ๋ ์ธ์ฆ ๋ฐฉ๋ฒ์ ‘https://***.ipdisk.co.kr/์ํธ ์ฝ๋/๋ช ๋ น’ ํ์์ผ๋ก ์ ์ ์ ์ํธ ์ฝ๋ ๋ถ๋ถ์ด ์ด์ ์์ฑ๋ ์ฝ๋์ ๋์ผํ๋ฉด ์ ์์ ์ธ ์๋์ ํ๊ณ , ํ๋ฆฌ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ฒ ์ค๊ณํ๋ ค๊ณ ํ์๋ค.
ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์๋ค. ์ฒซ์งธ๋ /์ํธ์ฝ๋/๋ช ๋ น ํ์์ผ๋ก ๋ง๋ค๋ฉด ํ์ฌ ๋ช ๋ช ์ด ์ ์์ ํ๋์ง ์๊ธฐ๊ฐ ํ๋ค๊ธฐ๋ ํ๊ณ ์ฌ์ดํธ์ ๋ชจ๋ ๋ฉ๋ด๋ ํญ๋ชฉ๋ค์ ์ฃผ์์ ‘/์ํธ ์ฝ๋/’๋ฅผ ์ถ๊ฐํด ์ฃผ์ด์ผ ํ๋ค. ์ด๋ ๋๋ฌด ๋ฒ๊ฑฐ๋ก์ฐ๋ฉด์๋ ๋ณต์กํ ๋ฐฉ๋ฒ์ด์๋ค.HTTP Session์ ์ฌ์ฉ
๐ช
์ข ๋ ๊ฐ๋จํ๋ฉด์๋ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ด ์์๊น? ๋ผ๋ ์๊ฐ์ ๊ฒ์์ ํ๋ฉฐ ์ด์ฌํ ์ ๋ณด๋ฅผ ๋ชจ์๋ค. ๊ทธ๋ฌ๋ค๊ฐ HTTP Session ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ด๊ฒ์ ํฌํธ ์ฌ์ดํธ์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ด์๋ค. ์๋ ๋ฐฉ์์ ์๋์ ๊ฐ์๋ค.
- ์ฌ์ฉ์์ ์ํธ ์ฝ๋๊ฐ ์๋ฒ์ ์ํธ ์ฝ๋์ ์ผ์นํ๋์ง ํ๋จ
- ์๋ฒ๊ฐ ์ฌ์ฉ์์ ์ํธ ์ฝ๋๊ฐ ๋ง๋ค๊ณ ์๊ฐ๋ ๊ฒฝ์ฐ ํด๋น Session-id๋ฅผ ๊ธฐ์ต, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก
- ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ Session-id๋ฅผ ์ฟ ํค๋ผ๋ ํ์์ผ๋ก ์ ์ฅ, ์น ํ์ด์ง์ ์ ์ ์ Session-id๋ฅผ ๊ฐ์ด ์ ์ก
- ์๋ฒ๋ Session-id๊ฐ ์ ์์ ์ผ ๊ฒฝ์ฐ ์นํ์ด์ง ์กฐ์์ ํ์ฉ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ ์ ์๋ฒ๋ ํด๋น Session-id ์ ๊ฑฐ
HTTP Session์ ์ด์ฉํ ๋ฐฉ์์ ์ ์ ์ ํ ๋ฒ์ ์ฑ๊ณต์ ์ธ ๋ก๊ทธ์ธ์ผ๋ก ๋ก๊ทธ์์ ์ ๊น์ง ์ํธ ์ฝ๋์ ํต๊ณผ ์ํ๊ฐ ์ ์ง๋์๋ค. ๊ทธ๋์ ๋ชจ๋ ๋ฉ๋ด์ ‘/์ํธ ์ฝ๋/’ ๊ตฌ๋ฌธ์ ๋ฃ์ด์ค ํ์๋ ์์๋ค. ๋ค๋ง, ์ถ๊ฐ์ ์ผ๋ก ์๊ฐํด์ผ ํ๋ ๋ถ๋ถ์ด ํ๋ ์์๋ค. ์ฒ์์ ์ํธ ๋ก๊ทธ์ธ ๋ถ๋ถ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํํด ์ค ๊ฒ์ธ๊ฐ? ์ ๊ดํ ๊ฒ์ด์๋ค.
๋คํํ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ๋ ์ตํ์๋ HTTP REST ์ค GET์ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค. GET์ ๊ตฌ๊ธ์ด๋ ๋ค์ด๋ฒ๋ฑ ๊ฒ์์์ง์ ๊ฒ์ ์ ์ฌ์ดํธ ๋ค์ '?q=๊ฒ์์ด'์ ๊ฐ์ด ๋ฌผ์ํ์ ํญ๋ชฉ์ด ๋์ด๋๋ ๊ฒ์ด์๋๋ฐ ์ด๋ฅผ ์ํธ ์ฝ๋๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ์ผ๋ก ์ด์ฉํ๊ธฐ๋ก ํ๋ค.
์๋ฅผ ๋ค๋ฉด passcode๋ผ๋ ํญ๋ชฉ์ ๊ฐ์ด 0851 ์ด๋ผ๋ฉด ‘https://***.ipdisk.co.kr/?passcode=0851’ ๋ก ์ ์ํ๋ค๋ฉด ์๋์ผ๋ก ๋ก๊ทธ์ธ์ด ๋๋ฉด์, ์๋์ผ๋ก ๋ก๊ทธ ์์ ์ ๊น์ง๋ ‘https://***.ipdisk.co.kr’์ ์ ์ํ๋ฉด ์ค๋งํธ ์นดํธ์ ์ ์ด ํ์ด์ง๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์๊ฒ ์ค๊ณ๋ฅผ ์งํํ์๋ค.
์ต๋ ์ฌ์ฉ์ ์ ์ ํ ๋ฐฉ๋ฒ
์ฌ๋ด์ด์ง๋ง, ์ด๋ฅผ ์์ฉํ์ฌ ์ต๋ ์ฌ์ฉ์ ์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์์ฒญ ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ค. currentsession์ด๋ผ๋ ์ ์ญ ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ ์ํธ ์ฝ๋๋ก ์ ์ํ ์ฌ๋์ด ์๊ธธ ๊ฒฝ์ฐ ํด๋น ์ ์ญ ๋ณ์์ ๊ฐ์ +1์ด ๋๊ฒ ์ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์์ ์ ํด๋น ๊ฐ์ 0์ผ๋ก ๋๊ฒ ์ค์ ํ์๋ค.
์ด๋ ๊ฒ ์น ๊ธฐ์ ๊ณผ ํ์ด์ฌ ์ฝ๋ฉ์ ํ์ฉํ์ฌ ์๊ฐ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉ์ ์ ํ ๊ธฐ๋ฅ์ ์์ฑํ ์ ์์๋ค.@app.route('/logout') def logout(): global currentsession if secretdb in session: currentsession = 0 session.pop(secretdb, None) resetsecretword() flash('You logged out!') print("Reset!") return redirect ('/')
๋ก๊ทธ์์ ์์ ์ฝ๋
์น ์ฌ์ดํธ๋ ์ ๋ฃฐ๋ฌ ๋คํธ์ํฌ๋ฅผ ํตํ ์ธ๋ถ์์ ์ ์์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
์๋ฒ๊ฐ ๊ณต์ ๊ธฐ ๋คํธ์ํฌ์ ์ํด ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ ์๋ฒ์ ํฌํธ๋ฅผ 5000๋ฒ์ผ๋ก ํ๊ณ , ๊ณต์ ๊ธฐ์ ํฌํธ ํฌ์๋ฉ ๊ธฐ๋ฅ์ผ๋ก ์ธ๋ถ ์ ์ ํฌํธ๋ฅผ HTTPS์ ๊ธฐ๋ณธ ํฌํธ์ธ 443์ผ๋ก ๋ง์ถ ๋ค์ ๋ด๋ถ IP์ฃผ์๋ฅผ ์๋ฒ IP๋ก, ํฌํธ๋ฅผ 5000๋ฒ์ผ๋ก ํด์ฃผ๋ฉด ๋๋ค.
์ด ๋ถ๋ถ์ ์ฌ์ค HTTPS๋ฅผ ์ ์ฉํ ๋ ์ด๋ฏธ ๊ฑฐ์ ์ฑ๊ณตํ ๊ธฐ๋ฅ์ด์๋ค. ํน๋ณํ ๊ณ ๋ คํด์ผ ํ๋ ์ ์ผ๋ก, Flask ๊ฐ๋ฐ ์๋ฒ์์ ์ธ๋ถ ์ ์์ ํ์ฉํ๊ธฐ ์ํด์ host ๊ฐ ์ค์ ์ 0.0.0.0์ผ๋ก ํด์ผ ํ๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ HTTPS ์ธ์ฆ์ ์ ์ฉ์ ํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก HTTP๋ก๋ ์ ์์ด ๋ถ๊ฐ๋ฅํ๊ณ , HTTPS๋ก๋ง ์ ์ํ ์ ์๊ฒ ๋๋ค๋ ์ ์ด์๋ค.
์ฌ์ดํธ๋ ์ฒ์ ๋ณด๋ ์ฌ๋๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ์ ๋๋ก ๊ฐ๊ฒฐํ๊ณ ๊น๋ํด์ผ ํ๋ค.
์ด๋ฏธ ๋ง๋ค์ด์ง ๋ธ๋ก๊ทธ ์คํจ์ ์กฐ๊ธ์ฉ ์์ ํ๋ ๊ฒ์ ์ฌ๋ฌ ๋ฒ ํด๋ดค์ง๋ง, ์ฌ์ดํธ๋ฅผ ์ฒ์๋ถํฐ ๋ง๋ค์ด๋ณธ ๊ฒฝํ์ ์์ด์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๋ง๋งํ๋ค. ์ด๋ป๊ฒ ๋ง๋ค๋ฉด ์ข์์ง ๊ณฐ๊ณฐ์ด ์๊ฐํ๋ ์ค, ์์ ๋ธ๋ก๊ทธ ์คํจ์ ์์ ํ ๋ ์ ํ๋ Bootstrap ํ๋ ์ ์ํฌ๋ผ๋ ๊ฒ์ ์ด์ฉํด ๋ณด๋ฉด ์ด๋จ๊น? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
Bootstrap์ ๋ฐ์ํ ์นํ์ด์ง๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ์ ๊ฐ์ ๊ฒ์ด์๋๋ฐ, ์๋ ์ ๋ช ํ ํ๋ก๊ทธ๋จ์ด๋ผ์ ๊ทธ๋ฐ์ง ์ธํฐ๋ท์ ์์ ๊ฐ ์๋นํ ๋ง๊ณ , Bootstrap ๊ณต์ ํํ์ด์ง์ ์ค๋ช ๋ ๊ด์ฐฎ์์ ๋ค๋ฃจ๊ธฐ๋ ์ฝ๊ณ ๋ง๋๋ ์ฌ๋ฏธ๋ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ์ ์น ํ์ด์ง๋ ์ฝ 1์ฃผ์ผ ๋ง์ ์์ฑํ ์ ์์๋ค.
Bootstrap์ ์ด์ฉํ ๊ฒ์ ์ข์์ผ๋, ๊ต๋ด ์์ดํ์ด๋ฅผ ์ด์ฉํด์ ๋ด๊ฐ ๋ง๋ Bootstrap ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฉ์ธ ํ์ด์ง๋ฅผ ์ ์ํ๋๋ฐ ๊ฑฐ์ 30์ด๊ฐ ๋๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ฌธ์ ์ ์ด ์์๋ค.
ํด๋น ๋ฌธ์ ๋ ๊ต๋ด ์ธํฐ๋ท๋ง์ด ๋ฌด์จ ์ด์ ์์์ธ์ง Bootstrap ์ฌ์ฉ์ ํ์ํ ํ์ผ๋ค์ ์ธ๋ถ CDN ์๋ฒ๋ก๋ถํฐ ๋ถ๋ฌ์ค์ง ๋ชปํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Bootstrap์ ์น์๋ฒ PC์์ Flask๋ฅผ ํตํด ๋ณ๋๋ก ์ ์กํด ์ฃผ๋ ๋ฐฉ๋ฒ์ด ํ์ํด ๋ณด์๋ค. ๋ง์นจ Flask ์๋ฒ ์ชฝ์์ Bootstrap ์ง์์ ๋์์ฃผ๋ Flask-Bootstrap์ด๋ผ๋ ํ์ด์ฌ ๋ชจ๋์ ์ด์ฉํ๋ค.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์, ํด๋น ๋ชจ๋์ Bootstrap ํ๋ ์ ์ํฌ ๋ฒ์ ์ด ์ต์ ๋ฒ์ ์ด ์๋, 3.3 ๋ฒ์ ๋์ ๊ณผ๊ฑฐ ๋ฒ์ ์ด์ด์ ์น์์ ์์ ๋ฅผ ์ฌ์ฉํ ๋ ์ ๋๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค๋ ์ ์ด๋ค.
์ด์จ๋ Bootstrap๊ณผ Jinja2๋ผ๋ Flask๋ด์ ๋์ ์น ์์ฑ ํ๋ก๊ทธ๋จ, ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ผ๋ก WTForms์ ์ด์ฉํ์ฌ, ๋๋ฆ ๊น๋ํ ์น ํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐ ์ฑ๊ณตํ๊ณ , ๋จ๋ค์๊ฒ ์ถฉ๋ถํ ๋ณด์ฌ์ค ๋งํ ์ฌ์ดํธ๋ฅผ ์์ฑํ๋ค. ์ด์ ์ด๋ ๊ฒ ์์ฑํ ์น ์๋น์ค์ NFC, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ์๋ค์ ํ๋ก๊ทธ๋จ๊ณผ์ ์ฐ๋, ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๊ฒํ ๊ฐ ๋จ์๋ค.
<div class="row"> <div class="col-md-6"> <h2>๋ฌผํ ๊ฒ์</h2> <form action="" method="post" role="form"> {{ form.csrf }} <div class="form-group"> {{ wtf.form_field(form.select) }} {{ wtf.form_field(form.search) }} </div> <br> <center> <button type="submit" class="btn btn-primary btn-block">๊ฒ์</button> </center> </form> </div>
HTML๋ก ์์ฑ๋ ๋ฌผํ ๊ฒ์ ๋ฒํผ์ ์ผ๋ถ
์ฌ๋ด
์ธ์ ๋ถํด๊ฐ ํฐ์คํ ๋ฆฌ ์๋ํฐ์์ SVG ํ์ผ์ด ๋ฐ๋ก ์ฌ๋ ค์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ํ ์ด๋ฏธ์ง๋ก ์ง์ ๋ ๊ฐ๋ฅํด์ ์ ๋ง ์ข์์ง ๊ฒ ๊ฐ๋ค.
[SVG ํ์ผ]
Flask logo ์ถ์ฒ: Armin Ronacher, Copyrighted free use, via Wikimedia Commons
Lets Encrypt logo ์ถ์ฒ: letsencrypt.org/trademarks
Bootstrap ํ๋ ์์ํฌ ๋ก๊ณ ์ถ์ฒ: Bootstrap, Public domain, via Wikimedia Commons
- ์ฐธ์กฐํ ์์ ๋ Flask๋ก ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ๊ธ์ธ opentutorials.org์ opentutorials.org/module/3669/22070, ์์ ๊ด๋ฆฌ ํ์ด์ง๋ฅผ ๋ง๋๋ ๊ธ์ธ www.blog.pythonlibrary.org/2017/12/15/flask-101-filtering-searches-and-deleting-data/ ์๋ค. [๋ณธ๋ฌธ์ผ๋ก]
- ๋ฌผํ์ด ์์นํ ์ธต์๋ฅผ ๋ํ๋ด๋ ํญ๋ชฉ์ด์์ง๋ง, ์ธต ๊ตฌํ์ด ์ด๋ ค์ ์ค์ ๋ก ์ฌ์ฉ๋์ง๋ ์์๋ค. [๋ณธ๋ฌธ์ผ๋ก]
- Win-acme ์ธ์ฆ์ "type": "urn:ietf:params:acme:error:caa" ; detail": "CAA record for ***.ipdisk.co.kr prevents issuance" ์๋ฌ๊ฐ ๋๋ค [๋ณธ๋ฌธ์ผ๋ก]