How to deploy in Streamlit with Unsplash API (Streamlit에서 Unsplash, chatgpt API 사용 보안 관련 문제)
1. Cursor로 Code를 생성하면 Unsplash는 이런 코드를 준다.
UNSPLASH_ACCESS_KEY ="키넣어주세요"
def get_random_image():
try:
# Unsplash API를 사용하여 가로형 무작위 이미지 가져오기
response = requests.get(
f"https://api.unsplash.com/photos/random?orientation=landscape&client_id={UNSPLASH_ACCESS_KEY}"
)
response.raise_for_status() # HTTP 오류가 발생하면 예외를 발생시킵니다.
data = response.json()
# 'urls' 키가 존재하는지 확인
if 'urls' in data and 'regular' in data['urls']:
return data['urls']['regular']
else:
st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.")
return None
except requests.exceptions.RequestException as e:
st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}")
return None

그래서 Chatgpt에게 어떻게 해결할지 물어봤다. 그리고 완성 된 코드
2. 문제는 이 코드가 Streamlit data leak 보안 검토에 계속 해서 걸린다는 것이다.
# 환경 변수에서 API 키 가져오기
UNSPLASH_ACCESS_KEY = os.getenv("UNSPLASH_ACCESS_KEY")
def get_random_image():
try:
# Unsplash API를 사용하여 가로형 무작위 이미지 가져오기
headers = {"Authorization": f"Client-ID {UNSPLASH_ACCESS_KEY}"}
response = requests.get(
"https://api.unsplash.com/photos/random?orientation=landscape&query=fun",
headers=headers
)
response.raise_for_status() # HTTP 오류가 발생하면 예외를 발생시킵니다.
data = response.json()
# 'urls' 키가 존재하는지 확인
if 'urls' in data and 'regular' in data['urls']:
return data['urls']['regular']
else:
st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.")
return None
except requests.exceptions.RequestException as e:
st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}")
return None
https://chatgpt.com/share/67c2ff8d-9bac-8002-bde8-4e19ac5317ca
내가 Steamlit에 배포를 하려니까, unsplash api가 문제가 있어
ChatGPT의 말:어떤 문제가 발생했는지 좀 더 자세히 말해줄 수 있어?
- API 키 인증 문제
- 요청 제한(rate limit)
- 네트워크 문제
- 환경 변수 설정 문제
어떤 오류 메시지가 뜨는지 알려주면 더 정확히 도와줄 수 있어!
나의 말:def get_random_image(): try: # Unsplash API를 사용하여 가로형 무작위 이미지 가져오기 response = requests.get( f"https://api.unsplash.com/photos/random?orientation=landscape&client_id={UNSPLASH_ACCESS_KEY}" ) response.raise_for_status() # HTTP 오류가 발생하면 예외를 발생시킵니다. data = response.json() # 'urls' 키가 존재하는지 확인 if 'urls' in data and 'regular' in data['urls']: return data['urls']['regular'] else: st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.") return None except requests.exceptions.RequestException as e: st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}") return None
ChatGPT의 말:코드를 보면, Unsplash API에서 무작위 이미지를 가져오도록 설정되어 있는데, 몇 가지 체크해볼 만한 부분이 있어.
1. 환경 변수(UNSPLASH_ACCESS_KEY) 확인
UNSPLASH_ACCESS_KEY 값이 올바르게 설정되어 있는지 확인해봐.
Streamlit 배포 시 secrets를 사용하면 좋아.
🔹 로컬 환경에서 실행하는 경우
python복사편집import os
UNSPLASH_ACCESS_KEY = os.getenv("UNSPLASH_ACCESS_KEY")
.env 파일이 있다면 dotenv 패키지를 사용해서 로드해야 할 수도 있어.
🔹 Streamlit Cloud에서 실행하는 경우
secrets.toml 파일 또는 st.secrets["UNSPLASH_ACCESS_KEY"] 방식으로 값을 가져와야 해.
python복사편집UNSPLASH_ACCESS_KEY = st.secrets["UNSPLASH_ACCESS_KEY"]
2. API 응답 구조 확인
Unsplash의 random photo API는 무료 계정에서는 요청 제한(rate limit)이 걸릴 수 있어.
코드에서 data['urls']['regular']을 가져오는데, API 응답을 직접 출력해서 구조를 확인해봐.
python복사편집st.write(data) # API 응답 출력
만약 응답이 예상과 다르면, errors 필드가 있는지도 확인해야 해.
3. 요청 제한 확인 (Rate Limit)
무료 계정은 시간당 50~100개의 요청 제한이 있어. 제한이 걸리면 403 Forbidden 응답이 올 수도 있어.
python복사편집if response.status_code == 403:
st.error("API 요청 제한이 초과되었습니다. 잠시 후 다시 시도해 주세요.")
🔹 API 호출이 너무 잦다면?
- 캐싱을 이용해서 불필요한 API 요청을 줄일 수 있어.
- st.cache_data를 활용해보자.
python복사편집@st.cache_data
def get_random_image():
# API 호출 코드 (위 코드와 동일)
4. API 호출 시 헤더 추가 (권장사항)
Unsplash에서는 API 호출 시 User-Agent나 Authorization 헤더를 추가하는 것이 좋다고 권장해.
python복사편집headers = {"Authorization": f"Client-ID {UNSPLASH_ACCESS_KEY}"}
response = requests.get(
"https://api.unsplash.com/photos/random?orientation=landscape",
headers=headers
)
🔍 결론적으로 확인해볼 것
✅ UNSPLASH_ACCESS_KEY가 올바르게 설정되었는가?
✅ data 응답 구조가 예상과 같은가? (st.write(data))
✅ 요청 제한이 걸린 것은 아닌가? (403 Forbidden)
✅ 헤더를 추가해서 요청하면 문제가 해결되는가?
이렇게 하나씩 확인해보면 원인을 찾을 수 있을 거야! 🚀
3. 이렇게 코드가 완성 되면 Streamlit에서는 API Key를 따로 넣어줘야 한다.
