* java ์ฝ๋ ์ค filter์๋ค๊ฐ csp๋ฅผ self๋ก ์ค์ ํด๋์๋ค.
(springboot ํ๋ก์ ํธ)
package .....;
import java.io.IOException;
import org.springframework.stereotype.Component;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class CspHeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Content-Security-Policy",
"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'");
chain.doFilter(request, response);
}
}
๊ทธ๋ฌ๋๋ ๊ฐ๋ฐ์๋๊ตฌ์์ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์.
Refused to execute inline event handler because it violates
the following Content Security Policy directive:
"script-src 'self'". Either the 'unsafe-inline' keyword,
a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
Note that hashes do not apply to event handlers, style attributes and javascript:
navigations unless the 'unsafe-hashes' keyword is present.
์ ์๋ฌ ๋ฉ์์ง๋ Content Security Policy(CSP) ์๋ฐ์ผ๋ก ์ธํด ๋ฐ์ํ ๊ฒ์ ๋๋ค.
์ฆ, ๋๋ ํ ํ์ JS ์ฝ๋์์ onclick ๊ฐ์ inline ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ <script> ํ๊ทธ์ ์ง์ ์ฝ์ ๋ JS๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์
๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด์์ ์ํด ์ด๋ฅผ ๊ฑฐ๋ถํ ๊ฒ์ ๋๋ค.
๐ ์์ธ ์์ฝ
CSP ์ ์ฑ ์ด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ:
์ด ๊ฒฝ์ฐ์๋:
- <button onclick="doSomething()"> โ ํ์ฉ๋์ง ์์
- <script>alert('hi')</script> โ ํ์ฉ๋์ง ์์
- <script src="/js/app.js"></script> โ ์ธ๋ถ ํ์ผ์์๋ง ์คํ ๊ฐ๋ฅ
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
โ 1. Inline ์ด๋ฒคํธ ์ ๊ฑฐ
๋ชจ๋ inline ์ด๋ฒคํธ(onclick, onload, onmouseover ๋ฑ)๋ฅผ ์ ๊ฑฐํ๊ณ JS ์ฝ๋๋ก ๋ถ๋ฆฌํ์ธ์.
๋ณ๊ฒฝ ์ :
๋ณ๊ฒฝ ํ:
โ 2. CSP ์ ์ฑ ์ํ (๊ถ์ฅํ์ง ์์)
์ ๋ง ๋ถ๊ฐํผํ ๊ฒฝ์ฐ, CSP๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ฉด ๊ฐ๋ฅํ์ง๋ง ๋ณด์์ ๊ถ์ฅ๋์ง ์์ต๋๋ค:
๋๋ ๋ ์์ ํ๊ฒ nonce ๋ฐฉ์์ ์ฌ์ฉ:
๊ทธ๋ฆฌ๊ณ <script nonce="abc123">...</script> ๊ฐ์ด ์ ์ฉ.
โ 1. CSP ์ ์ฑ ์ด๋?
**CSP(Content Security Policy)**๋ ์น์ฌ์ดํธ์ ์คํฌ๋ฆฝํธ, ์ด๋ฏธ์ง, ์คํ์ผ ๋ฑ์ ์ถ์ฒ๋ฅผ ์ ์ดํ๋ ๋ณด์ ์ ์ฑ
์
๋๋ค.
XSS ๊ณต๊ฒฉ(์คํฌ๋ฆฝํธ ์ฝ์
๊ณต๊ฒฉ) ๋ฑ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์์ CSP:
์ด ๋ง์:
- ์ค์ง **๊ฐ์ ์ถ์ฒ(origin)**์ JS ํ์ผ๋ง ์คํ ๊ฐ๋ฅ
- onclick="..." ๊ฐ์ inline JS ์ฝ๋๋ ์คํ ๋ถ๊ฐ
- <script>alert('hi')</script> ๋ ์คํ ๋ถ๊ฐ
๋๊ฐ์ ๊ฒฝ์ฐ onclick ์์ฑ์ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ filter ์์ฒด๋ฅผ ๋นผ๋ฒ๋ฆผ ~!
'๊ฐ๋ฐ ์ผ์ง ๐ฉโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์๋ฆฌํ๋ฅผ ํ์ฉํ์ฌ n๋ฒ ๋ฐ๋ณตํ๋ for๋ฌธ(๋ฐ๋ณต๋ฌธ) ์ฌ์ฉํ๋ ๋ฒ (0) | 2025.05.13 |
---|---|
์๋์ฐ์ Node.js ์ค์น ๋ฐฉ๋ฒ (1) | 2025.05.13 |
spring boot) js ํ์ผ ๋๋ ํ ๋ฐฉ๋ฒ (0) | 2025.05.12 |
cursor ai / VSCode ์ฃผ์ ์๊น ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ (0) | 2025.05.12 |
cursor ai์์ ์คํ๋ง๋ถํธ ํ๋ก์ ํธ ์ฒ์ ์์ํ ๋ (0) | 2025.05.12 |