Today
-
Yesterday
-
Total
-
  • ์Šค๋งˆํŠธ ์นดํŠธ ์„ค๊ณ„๊ธฐ (2) - ์›น ์„œ๋น„์Šค ์ฝ”๋”ฉ์˜ ์‹œ์ž‘
    Soliloquy 2020. 12. 25. 00:01

    ๐Ÿ”จ

     

    ์›น ์„œ๋น„์Šค ์ฝ”๋”ฉ์˜ ์‹œ์ž‘

    ๋‚ด๊ฐ€ ๋งก๊ฒŒ ๋œ ๊ธฐ๋Šฅ๋“ค ์ค‘ ์›น ์„œ๋น„์Šค ์ฝ”๋”ฉ์„ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ƒ์ „ ์ฒ˜์Œ ๋ณด๋Š” NFC๋ณด๋‹ค๋Š” ์›น์‚ฌ์ดํŠธ ๊ตฌํ˜„์ด ๋” ์‰ฝ๊ธฐ๋„ ํ•˜๊ณ , ๋ณธ ์ž‘ํ’ˆ์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์ด๋ผ ์ƒ๊ฐ๋๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    Flask์˜ ํ™œ์šฉ

    ์›น ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์–ด๋– ํ•œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ์ •ํ•ด์•ผ ํ–ˆ๋‹ค. ๊ณผ๊ฑฐ Flask๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํŠน๊ฐ•์„ ๋ฐ›์€ ์ ์ด ์žˆ์–ด์„œ, ์›น์„œ๋ฒ„ ๊ตฌ๋™ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ Flask๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

     

    ๋น„๋ก ์•ฝ 6๊ฐœ์›”๋„ ๋” ๋œ ๊ธฐ์–ต ์†์—์„œ ๋‹น์‹œ์˜ Flask์‚ฌ์šฉ ๊ธฐ์–ต์€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜์ง€๋งŒ, ์‚ฌ์šฉ ์–ธ์–ด๊ฐ€ ๋‚˜๋ฆ„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์–ธ์–ด์ค‘ ํ•˜๋‚˜์ธ Python์ด์—ˆ๊ณ , ์ธํ„ฐ๋„ท์—๋Š” ์ด๋ฏธ ์ˆ˜๋งŽ์€ ์˜ˆ์ œ๊ฐ€ ๋‚˜์™€ ์žˆ์–ด์„œ ์‚ฌ์šฉ์— ํฐ ๋ฌด๋ฆฌ๋Š” ์—†์—ˆ๋‹ค. Flask๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๊ฒ ๋‹ค๋Š” ํ™•์‹ ์„ ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ   ์›น ์‚ฌ์ดํŠธ์˜ ํŠน์ง•์„ ๋จผ์ € ์ •ํ•œ ํ›„, ํ•  ์ผ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๊พธ์ค€ํžˆ ํ•ด ๋‚˜๊ฐ”๋‹ค.

     

    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_CERT

    OpenSSL๋กœ ๋งŒ๋“  ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ๊ณ 

     

    ๊ณต์ธ ๊ธฐ๊ด€์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ

    ๊ณต์ธ๋œ ๊ธฐ๊ด€์˜ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

     

    1. ์›น ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ
    2. ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๋น„์šฉ

     

    ๊ธฐ๋ณธ์ ์œผ๋กœ 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 ์ธ์ฆ์„œ๋ฅผ ์ข…์ข… ๋ด์™”๋Š”๋ฐ, ์‚ฌ์ดํŠธ ์ ‘์† ์‹œ ๋ณ„ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•˜๋‹ˆ, ๋ญ”๊ฐ€ ์จ๋ณด๊ณ  ์‹ถ์—ˆ๊ธฐ๋„ ํ–ˆ๋‹ค.

     

    ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ธฐ๊ด€์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐ›๋Š”๋ฐ์— ์‹คํŒจํ–ˆ๋‹ค. 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-acme

    N: Create renewal (default settings)
    M: Create renewal (full options)
    R: Run renewals (0 currently due)
    A: Manage renewals (1 total)
    O: More options...
    Q: Quit

    Please 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๊ฐ€์ง€๋ฅผ ๊ตฌ์ƒํ•˜์˜€๋‹ค.

     

    1. ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ๊ณผ ์ผํšŒ์šฉ ์•”ํ˜ธ ์ƒ์„ฑ ๋ฐ ์ธ์ฆ ๋ฐฉ๋ฒ•
    2. ์ตœ๋Œ€ ์‚ฌ์šฉ์ž ์ˆ˜ ์ œํ•œ ๋ฐฉ๋ฒ•

    ์ดˆ๊ธฐ ๊ตฌ์ƒํ•œ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ๊ณผ ์ผํšŒ์šฉ ์•”ํ˜ธ ์ƒ์„ฑ ๋ฐ ์ธ์ฆ ๋ฐฉ๋ฒ• ์ค‘ ์ผํšŒ์šฉ ์•”ํ˜ธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ Python์„ ํ†ตํ•ด ๋ฌด์ž‘์œ„ ๋ฌธ์ž์™€ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•”ํ˜ธ ์ฝ”๋“œ ์ธ์ฆ ๋ฐฉ๋ฒ•์€ ‘https://***.ipdisk.co.kr/์•”ํ˜ธ ์ฝ”๋“œ/๋ช…๋ น’ ํ˜•์‹์œผ๋กœ ์ ‘์† ์‹œ ์•”ํ˜ธ ์ฝ”๋“œ ๋ถ€๋ถ„์ด ์ด์ „ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋ฉด ์ •์ƒ์ ์ธ ์ž‘๋™์„ ํ•˜๊ณ , ํ‹€๋ฆฌ๋ฉด ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.


    ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. ์ฒซ์งธ๋Š” /์•”ํ˜ธ์ฝ”๋“œ/๋ช…๋ น ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค๋ฉด ํ˜„์žฌ ๋ช‡ ๋ช…์ด ์ ‘์†์„ ํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ํž˜๋“ค๊ธฐ๋„ ํ•˜๊ณ  ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ๋ฉ”๋‰ด๋‚˜ ํ•ญ๋ชฉ๋“ค์˜ ์ฃผ์†Œ์— ‘/์•”ํ˜ธ ์ฝ”๋“œ/’๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ์ด๋Š” ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฉด์„œ๋„ ๋ณต์žกํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

     

    HTTP Session์˜ ์‚ฌ์šฉ

     

    ๐Ÿช

     

    ์ข€ ๋” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์— ๊ฒ€์ƒ‰์„ ํ•˜๋ฉฐ ์—ด์‹ฌํžˆ ์ •๋ณด๋ฅผ ๋ชจ์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ HTTP Session ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์€ ํฌํ„ธ ์‚ฌ์ดํŠธ์˜ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค. ์ž‘๋™ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

     

    1. ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ ์ฝ”๋“œ๊ฐ€ ์„œ๋ฒ„์˜ ์•”ํ˜ธ ์ฝ”๋“œ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํŒ๋‹จ
    2. ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ ์ฝ”๋“œ๊ฐ€ ๋งž๋‹ค๊ณ  ์ƒ๊ฐ๋  ๊ฒฝ์šฐ ํ•ด๋‹น Session-id๋ฅผ ๊ธฐ์–ต, ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก
    3. ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” Session-id๋ฅผ ์ฟ ํ‚ค๋ผ๋Š” ํ˜•์‹์œผ๋กœ ์ €์žฅ, ์›น ํŽ˜์ด์ง€์— ์ ‘์† ์‹œ Session-id๋ฅผ ๊ฐ™์ด ์ „์†ก
    4. ์„œ๋ฒ„๋Š” Session-id๊ฐ€ ์ •์ƒ์ ์ผ ๊ฒฝ์šฐ ์›นํŽ˜์ด์ง€ ์กฐ์ž‘์„ ํ—ˆ์šฉ
    5. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ ์‹œ ์„œ๋ฒ„๋Š” ํ•ด๋‹น 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์„ ์ด์šฉํ•œ ๊ฒƒ์€ ์ข‹์•˜์œผ๋‚˜, ๊ต๋‚ด ์™€์ดํŒŒ์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  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.svg
    0.07MB

    Flask logo ์ถœ์ฒ˜: Armin Ronacher, Copyrighted free use, via Wikimedia Commons

     

    le-logo-wide.svg
    0.30MB

    Lets Encrypt logo ์ถœ์ฒ˜: letsencrypt.org/trademarks

     

    Bootstrap.svg
    0.00MB

    Bootstrap ํ”„๋ ˆ์ž„์›Œํฌ ๋กœ๊ณ  ์ถœ์ฒ˜: Bootstrap, Public domain, via Wikimedia Commons

     

    1. ์ฐธ์กฐํ•œ ์˜ˆ์ œ๋Š” Flask๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๊ธ€์ธ opentutorials.org์˜ opentutorials.org/module/3669/22070, ์Œ์› ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ธ€์ธ www.blog.pythonlibrary.org/2017/12/15/flask-101-filtering-searches-and-deleting-data/ ์˜€๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
    2. ๋ฌผํ’ˆ์ด ์œ„์น˜ํ•œ ์ธต์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•ญ๋ชฉ์ด์—ˆ์ง€๋งŒ, ์ธต ๊ตฌํ˜„์ด ์–ด๋ ค์›Œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์•˜๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
    3. Win-acme ์ธ์ฆ์‹œ "type": "urn:ietf:params:acme:error:caa" ; detail": "CAA record for  ***.ipdisk.co.kr  prevents issuance" ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค [๋ณธ๋ฌธ์œผ๋กœ]

    ๋Œ“๊ธ€

์–ด์ œ๋Š” ์ด๊ณณ์— ๋ช…์ด ๋‹ค๋…€๊ฐ”์Šต๋‹ˆ๋‹ค.

Powered & Designed by Tistory