NginX๋ฅผ ์ด์ฉํด HTTPS ์ค์ ์ ํ Spring Boot ๋ฐฐํฌ ํ๊ฒฝ์์ Swagger ์ฌ์ฉ์ ์์ฒญ์ด ์ ๋๋ก ๊ฐ์ง ์๋ ์๋ฌ๊ฐ ๋ฐ์ํจ
- Security ๊บผ์ ธ ์์
- EC2์ ์ปจํ
์ด๋๋ก spring boot๊ฐ ๋์๊ฐ๋์ค์
- NginX์์ http, https ๋ชจ๋ ์์ฒญ ๊ฐ๋ฅํ๊ฒ ์ค์ ํด๋
Failed to fetch
์ฐ์ ๋ณ๋ค๋ฅธ ์ค์ ์ถ๊ฐ ์์ด ๊ธฐ๋ณธ ์ค์ ์ผ๋ก Swagger๋ฅผ ์ฌ์ฉ์ค์ธ๋ฐ Server๋ฅผ ์ดํด๋ณด๋ฉด http://172.17.0.2:8080 ์ผ๋ก ๋์ด์๋๊ฑธ ํ์ธํ ์ ์์
์ด๋ Spring boot ์ปจํ ์ด๋์ Docker ๋ด๋ถ IP์ธ๋ฐ
Spring Boot์์ server.address๋ฅผ ๋ณ๋๋ก ์์ฑํ์ง ์์ผ๋ฉด, Swagger๋ ๊ธฐ๋ณธ์ ์ผ๋ก Spring Boot ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ธ๋ฉ๋ ์ฃผ์๋ฅผ Server URL๋ก ์ฌ์ฉํจ
172.17.0.2 ์ ๊ฐ์ Docker ๋ด๋ถ IP๋ Docker ๋คํธ์ํฌ ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฐ ๋ธ๋ผ์ฐ์ (Swagger UI)๋ Docker ์ปจํ ์ด๋ ์ธ๋ถ (ํธ์คํธ ๋จธ์ )์์ ์คํ๋จ
=> ๋ธ๋ผ์ฐ์ ์์ ์ง์ Docker ๋ด๋ถ ๋คํธ์ํฌ๋ก ์ ๊ทผํ ์ ์์
๊ทธ๋์ ๊ฐ์ฅ ๋จผ์ ํ ๊ฒ์
@Configuration
class SwaggerConfig {
@Bean
fun openAPI(): OpenAPI = OpenAPI()
.addServersItem(Server().url("http://vocalab.kro.kr").description("Production Server"))
.addServersItem(Server().url("http://localhost:8080").description("Local Server"))
.components(Components())
.info(
Info()
.title("๋ณด์ด์คํฉ ํ๋ซํผ API")
.description("๋ณด์ด์คํฉ ํ๋ซํผ API ๋ฌธ์")
.version("v1.0.0")
)
}
SwaggerConfig ํ์ผ์์ addServersItem์ ํตํด Server url์ ๋ช ์ํด์ฃผ์์
์ด ๋ ๋ก์ปฌ ํ๊ฒฝ์์๋ Swagger๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด localhost:8080 ๋ ์ถ๊ฐํ์์
Mixed Content
์๋ฌด์๊ฐ ์์ด http://vocalab.kro.kr ์ Server์ ์ถ๊ฐํ๋๋ฐ
Swagger์์ ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด 403 Forbidden์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์
์ด๋ ์์์ ๋งํ๋ฏ์ด NginX๋ก HTTPS ์ค์ ์ด๋์ด ์๊ธฐ ๋๋ฌธ์ธ๋ฐ swagger-ui์ ์ ์ํ ๋
https://vocalab.kro.kr/swagger-ui/index.html ์ฆ, HTTPS ํ๊ฒฝ์ ๋ธ๋ผ์ฐ์ ์ ์คํ๋จ
๋ฐ๋ผ์, Swagger์์ API ์์ฒญ์ ๋ณด๋ผ ๋ http://vocalab.kro.kr Server๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด
HTTPS ํ๊ฒฝ์ธ Swagger UI์์ HTTP ์์ฒญ์ด ๋ฐ์ํ๋ฏ๋ก Mixed Content ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉฐ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ ์ ์ํด ์ฐจ๋จ๋จ
@Configuration
class SwaggerConfig {
@Bean
fun openAPI(): OpenAPI = OpenAPI()
.addServersItem(Server().url("https://vocalab.kro.kr").description("Production Server"))
.addServersItem(Server().url("http://localhost:8080").description("Local Server"))
.components(Components())
.info(
Info()
.title("๋ณด์ด์คํฉ ํ๋ซํผ API")
.description("๋ณด์ด์คํฉ ํ๋ซํผ API ๋ฌธ์")
.version("v1.0.0")
)
}
๋ฐ๋ผ์ ์์ ๊ฐ์ด https ์๋ฒ ์ฃผ์๋ฅผ ์ ๋ ฅํด์ค์ผํจ
(http๋ก Swagger UI์ ์ ์ํ๋ ๋ฐฉ์๋ ์์)
403 Forbidden
๊ทธ๋ผ ์ด์ ๋ ๊น?!
ํ์ง๋ง ์ฌ์ ํ
Error: response status is 403
Response headers
access-control-allow-headers: Authorization,Content-Type
access-control-allow-methods: GET,POST,PUT,DELETE,OPTIONS
access-control-allow-origin: *
connection: keep-alive
date: Tue,25 Mar 2025 14:48:18 GMT
server: nginx/1.24.0 (Ubuntu)
transfer-encoding: chunked
vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers
์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํจ
tail -f /var/log/nginx/access.log
EC2์ ์ ์ํด์ ์ ๋ช
๋ น์ด๋ก NginX์ access.log๋ฅผ ์ดํด๋ณด๋ฉฐ Swagger์์ ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด ๋ก๊ทธ๊ฐ ์ฐํ๋๊ฑธ ํ์ธํ ์ ์์
(NginX๊ฐ ๋ค๋ฅธ ํ๋ก์ EC2๊ฐ ์๋๋ผ Server๊ฐ ์์นํ EC2 ์์ฒด์ ์ค์น๋์ด์๋ ์ํฉ์)
=> NginX๊น์ง ์์ฒญ์ ๋๋ฌํ๋๊ฑธ ํ์ธ
๊ทธ๋ผ Spring Boot ์๋ฒ์ชฝ์์ ๋งํ๋ ๊ฒ ๊ฐ์๋ฐ
ํ์ฌ๊น์ง ํต์ ํ๋ฆ์ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด
1. ์ฌ์ฉ์๊ฐ https๋ก Swagger UI์ ์ ์ํจ
2. Swagger๊ฐ https://vocalab.kro.kr/api/... ๋ก API ์์ฒญ์ ๋ณด๋
3. NginX๊ฐ ์ด ์์ฒญ์ ๋ฐ์ ๋ด๋ถ Spring Boot ์ปจํ ์ด๋์ธ http://172.17.0.2:8080 ๋ก ์ ๋ฌํจ
4. Spring Boot ์ปจํ
์ด๋๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ํ, NginX๊ฐ ๋ค์ ์ฌ์ฉ์์๊ฒ ์๋ต ์ ๋ฌ
์ฆ, Swagger UI๋ ์ธ๋ถ์์ https://vocalab.kro.kr ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๊ตฌ์กฐ์ด์ง๋ง
NginX๊ฐ ๋ด๋ถ์ ์ผ๋ก http://172.17.0.2:8008 ๋ก ํ๋ก์ํ๋ ๊ตฌ์กฐ์
@Configuration
class WebConfig : WebMvcConfigurer{
override fun addCorsMappings(registry: CorsRegistry) {
registry.addMapping("/**") // ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด CORS ์ค์ (์ถํ ๋ณ๊ฒฝ)
.allowedOrigins(
"https://capstone-2025-09.vercel.app",
"https://vocalab.kro.kr"
)
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
}
}
์ด์ ๊ฐ์ด WebConfig์์ allowedOrigins์ https://vocalab.kro.kr์ ์ถ๊ฐํด์ฃผ๋ฉด์ ํด๊ฒฐํ์์
(Security ๋ฏธ์ฌ์ฉ์ค)
์๋ํ๋ฉด Spring ์ ์ฅ์์๋ ์์ฒญ์ Origin: https://vocalab.kro.kr ํค๋๋ฅผ ๋ณด๊ณ ์ธ๋ถ ์์ฒญ์ด๋ผ๊ณ ํ๋จํจ
=> Spring ์ ์ฅ์์ Origin ํค๋๋ฅผ ํตํด ์ด๊ฒ ๋ธ๋ผ์ฐ์ ์์ ์จ ์ธ๋ถ ์์ฒญ์ธ์ง ์๋์ง๋ฅผ ํ๋จํ๊ธฐ ๋๋ฌธ์ "๊ฐ์ ๋๋ฉ์ธ์ธ๋ฐ ์?" ๋ผ๋ ์๊ฐ์ด ๋ค๋๋ผ๋ ๊ฒฐ๊ตญ Spring์ด ํ์ฉํ์ง ์์ผ๋ฉด ์ฐจ๋จ๋๋ ์๋ฆฌ์
์์ฒญ์ด ์ ๊ฐ๋๊ฑธ ํ์ธํ ์ ์์
'๐ซ Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
application.yml์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผํ ๊น? (0) | 2025.06.21 |
---|---|
Spring Security์์ ๋ชจ๋ ์๋ฌ๊ฐ 403์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ (0) | 2025.05.11 |
[Spring Boot] AWS Lambda์ ํต์ ํ๊ธฐ (0) | 2025.03.30 |
NginX๋ฅผ ํตํด Spring Boot ์๋ฒ์ HTTPS ์ ์ฉํ๊ธฐ (0) | 2025.03.24 |
Spring Boot์์ Supabase ์ฌ์ฉํ๊ธฐ (Kotlin) (0) | 2025.02.25 |