๋ฐ๊ฐ์ต๋๋ค!
AI์ ์ปดํจํฐ ๊ณตํ์ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ ํ๊ตฌํ๋ฉฐ, ๊ทธ ์ฌ์ ์ ์ฌ๋ฌ๋ถ๊ณผ ๋๋๊ณ ์ถ์ ํด์ฌ์ ๋๋ค.
ํ๋ถ ์์ '์ปดํจํฐ ๊ณตํ ์ค๋ ์'๋ผ ๋ถ๋ฆด ๋งํผ ์ ๊ณต์ ๋ํ ์ด์ ์ผ๋ก 4.4์ ์ด์์ ์ ๊ณต ํ์ ์ผ๋ก ์์ ์กธ์ ํ์๊ณ , S๋ํ์์์ AI๋ฅผ ์ ๊ณตํ๋ฉฐ ์์ฌ ํ์๋ฅผ ๋ฐ๊ณ ๋ฐ์ฌ ๊ณผ์ ์ ํตํด ์ ๋ฌธ์ฑ์ ์ฌํํ์ต๋๋ค.
ํ์ง๋ง ์ด๋ก ์ ํ๊ตฌ๋งํผ์ด๋ ์ค์ ์ธ์์ ๋ฌธ์ ๋ฅผ AI๋ก ํด๊ฒฐํ๋ ๊ฒ์ ํฐ ๋งค๋ ฅ์ ๋๊ปด, ๋ฐ์ฌ ๊ณผ์ ์ ์ ์ ๋ฉ์ถ๊ณ ์คํํธ์ ์์ AI ๊ธฐ๋ฐ LLM ๋ฐ ๋น๋์ค ๋ถ์ ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๋ฉฐ ๊ท์คํ ์ค์ ๊ฒฝํ์ ์์์ต๋๋ค.
์ง๊ธ์ ๊ตญ๋ด Top3 ๋๊ธฐ์ ์ค ํ ๊ณณ์์ LLM ํ๋ก์ ํธ ๊ฐ๋ฐ ๋ฐ PM์ผ๋ก ์ผํ๋ฉฐ, AI ๊ธฐ์ ์ด ์ฐ๋ฆฌ ์ถ์ ๊ฐ์ ธ์ฌ ๊ธ์ ์ ์ธ ๋ณํ๋ค์ ๋ง๋ค์ด๊ฐ๋ ๋ฐ ๊ธฐ์ฌํ๊ณ ์์ต๋๋ค. ์ ๊ฐ ๊ฒช์๋ ๊ณ ๋ฏผ๊ณผ ํด๊ฒฐ์ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ํ์ฅ์์ ์ป์ ์์ํ ๋ ธํ์ฐ๋ค์ ์ฌ๋ฌ๋ถ๊ป ์๋์์ด ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. AI๋ผ๋ ํฅ๋ฏธ๋ก์ด ์ธ๊ณ๋ก์ ์ฌ์ ์ ๋ ๋ ํ ๊ธธ์ก์ด๊ฐ ๋์ด ๋๋ฆด๊ฒ์.
Courses
Reviews
- Master All Backend Knowledge with Just One Course!
- Master All Backend Knowledge with Just One Course!
exquisite789731
ยท
The Magic of 5 Lines of Code, 5-Line Machine Learning PyCaret: Adding AutoML Wings to Data Analysis ProjectsThe Magic of 5 Lines of Code, 5-Line Machine Learning PyCaret: Adding AutoML Wings to Data Analysis Projects- FastAPI: Make 3x quicker, 2x more accurate, 10x faster APIs with Python
- Master All Backend Knowledge with Just One Course!
Posts
Q&A
๊ฐ์ ์๊ฐ๋์ '์ด๋ฐ ๋ด์ฉ์ ๋ฐฐ์์' ์๋ชป ์ฌ๋ผ์จ๊ฑฐ ๊ฐ์์
์๋ ํ์ธ์, ์ฒ์ ์ ๊ณต๋๋ ํ ํ๋ฆฟ์ ํฌํจ๋ ๋ด์ฉ์ด ๋ฐ๋ก์ฌ๋ผ์๋ฒ๋ ธ๊ตฐ์ ๐ ๋ฐ๋ก ์์ ํ์์ต๋๋ค! ์น์ ํ ํผ๋๋ฐฑ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ! ์ฆ๊ฑฐ์ด ์๊ฐ๋๊ธธ ๋ฐ๋๋๋ค!! ์ธ์ ๋ ์ง๋ฌธ์ด ์๊ธฐ๋ฉด ํธํ๊ฒ ์ฌ๋ ค์ฃผ์ธ์!ํญ์ ์น์ ํ ๋ต๋ณํด๋๋ฆด๊ฒ์ ๐
- 0
- 2
- 12
Q&A
ydata_profiling ๋๋๋ง ์ด์
์๋ ํ์ธ์ ๊ฐ์ฌํด์ฌ์ ๋๋ค.ํ์ฌ ๋ณธ๊ฐ์ ๋ด๋ ค์์์ด ๋ต๋ณ์ด ๋ฆ๋ ์ํฉ์ ๋๋ค.๋น ๋ฅด๊ฒ ํ์ธ ํ ํ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค!๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 23
Q&A
github ์์ค์ฝ๋
์๋ ํ์ธ์, ๊ฐ์ฌ ํด์ฌ์ ๋๋ค.๋จผ์ ์๊ฐ์ ์ฒญํด์ฃผ์ ์ ๊ฐ์ฌํ๋ค๋ ๋ง์์ฌ๋ฆฝ๋๋ค. ๐ํ์ฌ ๊ฐ์์๋ฃ๋ PPT๊ฐ ์๋ ๋ ธ์ ์ ํ์ฉํ๊ณ ์๋๋ฐ์!์ด ์ด์ ๋ ๊ฐ์ ๊ฐ์ ๊ณผ ์ฐ๊ด์ด ์์ต๋๋ค. ํ๋ฒ ์ ์๋ ๊ฐ์๋ ์๊ฐ์ ๋ถ๋ค๊ป์ ๋จ๊ฒจ์ฃผ์๋ ํผ๋๋ฐฑ, ๋ณํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ณด๋ค์ ๊ณ์ํด์ ๋ฐ์ํด ๊ฐ์๋ฅผ ๊ฐ์ ํ๋ ์์ ์ ๋ฐ๋ณตํ๊ณ ์๋๋ฐ์! ๋ ธ์ ์ ๊ฒฝ์ฐ PPT์ ๋ฌ๋ฆฌ ์ฌ์ดํธ์ ๊ฐ์์๋ฃ๋ฅผ ๊ฒ์ํ๋ ํํ๋ผ์ ์๊ฐ์ ๋ถ๋ค๊ป ๊ฐ์ ๋ ๊ฐ์์๋ฃ๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ ๊ต์ฅํ ์ฉ์ดํฉ๋๋ค. ์ด ๋ Github์ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ๊ฐํน ๋ ํฌ์ ๊ฐ์์๋ฃ์ ๋ฒ์ ์ด ๋ง์ง ์๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ํ์ธ๋์ด ํ์ฌ๋ ๋ ธ์ ์ผ๋ก ๊ฐ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ๊ฐ ์ฑํฐ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๋ ํ๋ฒ ๋ ธ์ ์ ์๋จ์ ๊ธฐ์ ํด๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ต๊ทผ ๋ ํฌ ํํ์ ์์ค์ฝ๋ ๊ณต์ ๋ฅผ ์ํ๋ ์๊ฐ์๋ถ๋ค์ด ๋ณด์ฌ, Notion ๊ฐ์์๋ฃ์ Github ์์ค์ฝ๋๋ฅผ ์ฐ๋ ์ํค๋ ๋ฐฉ์์ ์ค๋นํ๊ณ ์์ผ๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 36
Q&A
๊ฐ์์๋ฃ ๋งํฌ๋ก ๋ค์ด๊ฐ๋ฉด ํ์ด์ง๋ฅผ ์ฐพ์ง๋ชปํ๋ค๊ณ ๋์์
์๋ ํ์ธ์ ๊ฐ์ฌ ํด์ฌ์ ๋๋ค ๐ ํ์ฌ ๊ฐ์ ์์์ ์ค๊ฐ์ค๊ฐ ์๋ฆฐ ๋ถ๋ถ์ด ์์ด ํด๋น ๋ถ๋ถ ์ฌ์ดฌ์์ ์งํํ๋๋ผ๊ฐ์์๋ฃ ๊ฒ์๋ฅผ 30๋ถ ์ ๋ ๋ฉ์ท์์ต๋๋ค! ํ์ฌ๋ ๋ค์ ์ ์์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ ํ์ธ ๋ถํ๋๋ ค์!์๋ก ์ดฌ์ํ ๊ฐ์ ์์์ 8/28์ผ๊น์ง ๋ชจ๋ ์ ๋ก๋๋ ์์ ์ด๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.๋ถํธ์ ๋ผ์ณ๋๋ ค ์ฃ์กํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.๊ฐ์ฌํด์ฌ ์ฌ๋ฆผ
- 1
- 2
- 47
Q&A
PDF๋ก ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ๋ถํ๋๋ฆฝ๋๋ค.
์ถ๊ฐ๋ก ํ์ธํด๋ณด๋ Chrome์ ์ฌ๋ฐฑ ์ต์ํ + ๋ฐฐ์จ ์กฐ์ ์ ํตํด ์๋ฆผ์์ด PDF๋ก ๋ด๋ณด๋ด๊ธฐ๊ฐ ๊ฐ๋ฅํ ๋ฏ ํฉ๋๋ค! ํ์ฉํด๋ณด์๊ณ ๋ฌธ์ ๊ฐ ์์ผ์๋ฉด ๋ง์๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค ๐
- 0
- 3
- 78
Q&A
PDF๋ก ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ๋ถํ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์, ๊ฐ์ฌ ํด์ฌ์ ๋๋ค.Notion ํ ํ๋ฆฟ ๋ณต์ ๊ธฐ๋ฅ์ 3์ผ๋์ ํ์ฑํํด๋๊ฒ ์ต๋๋ค!๊ฐ์ ์๋ฃ ๊ฐ์ , ์ ์๊ถ ๋ฑ์ ๋ฌธ์ ๋ก ์ธํด ์๊ตฌ ํ์ฑํ๋ ์ด๋ ค์ด ์ ์ํด๋ถํ๋๋ฆฝ๋๋ค. ํด๋น ๋ถ๋ถ ํ์ฉํ์ฌ PDF๋ก ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋๋ ์ง ํ์ธ ๋ถํ๋๋ฆด๊ฒ์ ๐ ๊ฐ์ฌํฉ๋๋ค.๊ฐ์ฌ ํด์ฌ ์ฌ๋ฆผ
- 0
- 3
- 78
Q&A
31๊ฐ ์ง๋ฌธ: /docs์ read_all_users ๊ด๋ จ
๐
- 1
- 3
- 62
Q&A
15๊ฐ ์์ ์์ฒญ: DOWNLOAD_DIR ํ์ธ ๊ตฌ๋ฌธ ๋ถ๋ถ
์๋ ํ์ธ์, ๊ฐ์ฌ ํด์ฌ์ ๋๋ค. ๋จผ์ ํผ๋๋ฐฑ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ง์ํด์ฃผ์ ๋๋ก ์๋๊ฒฝ๋ก(file_path)๋ฅผ ์ ๋๊ฒฝ๋ก(os.path.abspath(DOWNLOAD_DIR))์ startswith๋ก ๋น๊ตํ ๊ธฐ์กด ์ฝ๋๋ ์๋ํ ๊ฒ์ฆ์ด ์ ๋๋ก ๋์ํ์ง ์์ต๋๋ค.์ ๊ฐ ์ ๋ ๊ฒ ์ด ์ด์ ๋ ์์ ์ ํ๋ฆ์ ๋จ์ํ๊ฒ ๋ณด์ฌ์ฃผ๋ ค๋ค๊ฐ โ๊ฒฝ๋ก๋ฅผ ์์ ํ ๋ฃจํธ ์์ ๊ฐ๋์โ๋ ์ทจ์ง๋ง ๋จ๊ธฐ๊ณ , ์ ๋๊ฒฝ๋ก๋ก ์ ๊ทํํ๋ ๋จ๊ณ๋ฅผ ๋น ๋จ๋ ธ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๐ฟ๋๋ถ์ ๋ฌธ์ ๋ฅผ ๋ช ํํ ์ง์ ์ ์์์ด์. ๊ฐ์ฌํฉ๋๋ค.๋ง์ ์ฃผ์ ๋๋ก ์ ๋๊ฒฝ๋ก๋ก ๋ณํ ํ ๋น๊ตํ๋ฉด ์๋ฏธ ์๋ ๊ฒ์ฆ์ด ๋ฉ๋๋ค.DOWNLOAD_DIR_ABS = os.path.abspath(DOWNLOAD_DIR) safe_base_filename = os.path.basename(file_name) file_path = os.path.join(DOWNLOAD_DIR, safe_base_filename) full_file_path = os.path.abspath(file_path) # ๊ธฐ์กด: if not file_path.startswith(DOWNLOAD_DIR_ABS): # ์๋ vs ์ ๋ ๋น๊ต๋ผ ๋ฌธ์ if not full_file_path.startswith(DOWNLOAD_DIR_ABS): raise HTTPException(status_code=403, detail="Access denied") ์กฐ๊ธ ๋ ๊ณ ๊ธ ์ฃผ์ ๋ก ๋ค๋ค๋ณด์๋ฉด, startswith๋ .../downloadables2 ๊ฐ์ ์ ๋์ด ์ถฉ๋์ด๋ OS๋ณ ๊ฒฝ๋ก ์ฐจ์ด, ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ์ทจ์ฝํฉ๋๋ค. ๊ทธ๋์ ์๋์ฒ๋ผ โ์ข ๋ ์์ ํโ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ ๊ฑธ ๊ถํฉ๋๋ค.pathlib์ resolve()์ relative_to()๋ฅผ ์ฐ๋ฉด ์ฌ๋ณผ๋ฆญ ๋งํฌ, .. ํฌํจ ๊ฒฝ๋ก๊น์ง ์ ๊ทํํด ํ์คํ ๊ฐ๋ ์ ์์ด์.from pathlib import Path import os, mimetypes from fastapi import HTTPException from fastapi.responses import FileResponse BASE = Path(DOWNLOAD_DIR).resolve() def resolve_under_base(user_name: str) -> Path: safe = os.path.basename(user_name) # ๊ฒฝ๋ก ์ฑ๋ถ ์ ๊ฑฐ path = (BASE / safe).resolve() # ์ฌ๋ณผ๋ฆญ ๋งํฌ/.. ์ ๊ทํ try: path.relative_to(BASE) # BASE ๋ฐ์ด๋ฉด ValueError except ValueError: raise HTTPException(status_code=403, detail="Access denied") if not path.is_file(): raise HTTPException(status_code=404, detail="File not found") return path @app.get("/download/basic/{file_name}") async def download_basic(file_name: str): requested = resolve_under_base(file_name) return FileResponse(str(requested)) @app.get("/download/custom/{file_name}") async def download_custom(file_name: str): requested = resolve_under_base(file_name) media_type, _ = mimetypes.guess_type(str(requested)) media_type = media_type or "application/octet-stream" return FileResponse( path=str(requested), filename=f"downloaded_{requested.name}", media_type=media_type ) ๋์์ผ๋ก os.path.commonpath([requested, base]) == base ๋น๊ต๋ ์์ ํ ํธ์ ๋๋ค. (realpath/abspath๋ก ์ ๊ทํ ํ ์ฌ์ฉ)์ถ๊ฐ ํ!ํ์ฉ ๋ชฉ๋ก(allowlist): ์ ๊ณต ๊ฐ๋ฅํ ํ์ผ๋ช /ํ์ฅ์๋ฅผ ์ ํํ์ธ์.์ ๋์ฝ๋ ์ ๊ทํ: unicodedata.normalize("NFC", name)๋ก ์ด๋ฆ ํผ๋์ ์ค์ ๋๋ค.๋ก๊น ์ต์ํ: ์กด์ฌ ์ฌ๋ถ๋ฅผ ๊ณผํ๊ฒ ๋ก๊ทธ๋ก ๋ ธ์ถํ์ง ์๊ธฐ.ํ ์คํธ ์ผ์ด์ค: .., %2e%2e/, ์ฌ๋ณผ๋ฆญ ๋งํฌ, ์๋์ฐ/๋ฆฌ๋ ์ค ๊ฒฝ๋ก ์ฐจ์ด๋ฅผ ํฌํจํด ๋จ์ํ ์คํธ ์ถ๊ฐ.๋ค์ ํ ๋ฒ ๋ ์นด๋ก์ด ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ถ์ ์๋ฃ๋ฅผ ๋ ํํํ๊ฒ ๋ค๋ฌ์ ์ ์๊ฒ ๋์์ด์! ๐๊ณง ํด๋น ์๋ฃ๋ ๋ฐ์ํด๋๊ฒ ์ต๋๋ค ๐
- 0
- 2
- 45
Q&A
26๊ฐ ์๋ฌ๋ฐ์: ํด๊ฒฐ๋ฐฉ๋ฒ ์๋ ค์ฃผ์ธ์.
์๋ ํ์ธ์ ๊ฐ์ฌํด์ฌ์ ๋๋ค!์ธํ๋ฐ AI์ธํด๋์ด ๋๋ตํด์ฃผ์ ์ ๋คํ์ด๋ค์!์ด์ ์ ์ธ ๊ฐ์ ์๊ฐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!๐
- 0
- 3
- 68
Q&A
34๊ฐ ๊ฐ์ ๋ง์ง๋ง์ ๋์ค๋ 35๊ฐ websocket ๊ด๋ จ ๊ฐ์ ๊ด๋ จ ์ง๋ฌธ
์๋ ํ์ธ์! ๊ฐ์ฌํด์ฌ์ ๋๋ค.websocket ๋ถ๋ถ๋ ๊ฐ์์ ํฌํจ๋ฉ๋๋ค ๐์ด๋ฒ ์ฃผ๋ง๊น์ง๋ ์์ฑ ๊ฐ์ ๋ฐ ์ธ์ฝ๋ฉ์ ์๋ฃํด์ ์ ๋ก๋ํ๊ฒ ์ต๋๋ค!
- 1
- 1
- 61