xss-stage๋ ์ด๋ฏธ ๋ค์ํ xss๊ณต๊ฒฉ์ ํํฐ๋งํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ง๋ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค ์ ์ฉ๋ฐฉ์์ด ์ ๊ฐ๊ฐ์ด๋ฉฐ, ์ฌ๋ฌ xss ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ ์ํฉ(์ : json์ ํํฐ๋ง ํด์ฃผ์ง ๋ชปํ๋ lucy-xss ์ json์ ํํฐ๋งํด์ฃผ๋ ๋ค๋ฅธ xss ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผํ ๋)์์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ ์ฉํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ์ฉํ๋๊ฒ์ ๋๊ธฐ ์ํด ํ์ํ์ต๋๋ค.
xss-stage๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- ์ผ๊ด์ ์ด๊ณ ์ฌ์ด ์ ์ฉ ๋ฐฉ์ - ๊ฐ ์ํฉ์ ํจ์จ์ ์ธ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ผ๊ด๋ ์ ์ฉ๋ฐฉ์์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
- ์ฌ์ด ํ์ฅ๊ณผ ์ปค์คํ - XssFiltering ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด, ์ด ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํด ๋์์ ํํฐ๋ง ํ ์ ์์ต๋๋ค.
- ์ ํ์ ์ธ Xss filtering - ๊ผญ ํ์ํ ํ๋ผ๋ฏธํฐ์ url๋ง Xss filtering ๋์์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- ๋ฎ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ - Xss core์์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์กด์ฑ์ ์ค์ฌ, ์ธ์ ๋ ์ง ๊ตฌ์ฒด์ ์ธ ํํฐ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒดํ ์ ์์ต๋๋ค.
- ๊ฒ์ฆ๋ filtering ๊ตฌํ์ฒด๋ค - Xss stage ํ์ฅ์ธ xss-extension-string, xss-extension-json๋ ๊ฐ๊ฐ navercorp-lucy, jackson์ ์ฌ์ฉํด ๊ตฌํ๋์ด ์์ต๋๋ค.
- ์์ฒญ์์ ์งํ๋๋ xss filtering - Xss stage๋ ์์ฒญ์์ xss filtering์ด ์งํ๋๊ธฐ ๋๋ฌธ์ ์๋ต์ด ๋ ๋ง์ ์ํฉ์์ ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ํ๊ณณ์์ ๊ด๋ฆฌํ๋ xss filtering ์ ์ฑ - ์ ์ฑ ๊ด๋ฆฌ ํํธ์์ ๊ตฌํํ XssFiltering๊ตฌํ์ฒด๋ฅผ ๋ฑ๋กํ๊ณ , ๋ค๋ฅธ ํํธ์์ @Xss ์ด๋ ธํ ์ด์ ์ ํตํด ๊ตฌํ์ฒด๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ํ ๊ณณ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ์ธ Xss filtering ์ ์ฑ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
core : xss-core
string-extension : xss-extension-string - naver์ lucy-xss ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋์ด ์์ต๋๋ค.
json-extension : xss-extension-json - jackson์ databind๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋์ด ์์ต๋๋ค.
๋ค์ด๋ก๋์ ๊ดํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
xss-stage์์ ์ฌ์ฉํ ์ ์๋ ์ธํฐํ์ด์ค์ ํ์ฅ๋ฒ์ ๋ชจ๋ xss-core ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑ๋์ด ์์ต๋๋ค.
Custom Xss Filter๊ฐ ํ์ํ ์ํฉ์ด ์๋๋ผ๋ฉด, ๋ค์ ์ธํฐํ์ด์ค๋ก Xss-filtering์ ์งํํ ์ ์์ต๋๋ค.
๋ง์ฝ Custom Xss Filter๊ฐ ํ์ํ๋ค๋ฉด, ์ด ๋ค์ ๋ชฉ์ฐจ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
@XssFiltering
: ๋ฉ์๋์ ๋งํน๊ฐ๋ฅํ๋ฉฐ, ๋งํน๋ ๋ฉ์๋๋ XssFiltering์ ๋์์ด ๋ฉ๋๋ค.
@Xss
:@XssFiltering
์ด ๋งํน๋ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ ๋งํน๊ฐ๋ฅํ๋ฉฐ, ๋งํน๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์์ผ๋ก Xss filtering์ด ์งํ๋ฉ๋๋ค.@Xss
๋ String filterName() ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ด ๋ฉ์๋์ ๊ฐ์ ์ค์ ํ๋๊ฒ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ํํฐ๋งํ ๋ ์ฌ์ฉํ XssFilter๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. filterName()์ value()์ ๋์ผํ๋ฉฐ, ์ด ๋ ๋ชจ๋ ์๋ต๋๋ค๋ฉด, ํ๋ผ๋ฏธํฐ์ ํด๋์ค๋ช ์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝํ ๊ฐ์ผ๋ก XssFilter๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
๋ค์์ ์ค์ ์ฌ์ฉ์์ ์ ๋๋ค.
@RestController
public class Example{
@XssFiltering // ์ด ์ด๋
ธํ
์ด์
์ด ๋งํน๋ ๋ฉ์๋๋ XssFiltering์ ๋์์ด ๋ฉ๋๋ค.
@GetMapping("/example")
public Object helloworld(@Xss String param1, @Xss("json") SomeObject param2, @Xss("string") String param3, String param4){
// @XssFiltering ์ด๋
ธํ
์ด์
์ด ๋งํน๋ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ @Xss ์ด๋
ธํ
์ด์
์ ๋งํนํจ์ผ๋ก์จ Xss safeํ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
// @Xss์ value()์ ์ด๋ ํ ๊ฐ๋ ๋ค์ด๊ฐ์ง ์๋๋ค๋ฉด, ๋งํน๋ ํ๋ผ๋ฏธํฐ์ ํด๋์ค ์ด๋ฆ์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝํ ๊ฐ์ด ๋ฉ๋๋ค.
// @Xss์ value()์ ๊ฐ์ ๋ฃ์์ผ๋ก์จ, ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ํํฐ๋ง ํ๋๋ฐ ์ฌ์ฉํ XssFilter ๊ตฌํ์ฒด๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
// @Xss์ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ์ xss-extension ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
...
}
}
XssCore์ CustomFilter๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด ๋ฑ๋กํ ์ ์์ต๋๋ค.
- org.stage.xss.core.spi.XssFilter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก์ํจ๋ค.
๋ค์์ XssFilter์ธํฐํ์ด์ค ์ ๋๋ค.
package org.stage.xss.core.spi;
/**
* ์ด ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌ๋ฐ์ Xss-safe ํ ์๋ต์ ๋ฐํํด์ผํจ.
*
* @since 0.1
* @author devxb
*/
public interface XssFilter{
/**
* XssFilter ๊ตฌํ์ฒด์ ์ด๋ฆ์ ๋ฐํํจ. <br>
* ์ด ์ด๋ฆ์ Xss Filtering ๋์์ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋จ. {@link org.stage.xss.core.meta.Xss} <br>
*
* @return String XssFilter ๊ตฌํ์ฒด์ ์ ์ด๋ฆ
*/
String getFilterName();
/**
* ํ๋ผ๋ฏธํฐ 'dirty' ์ 'cast' ๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , <br>
* 'dirty' ๋ฅผ Xss-safe ํ ์ํ๋ก ํํฐ๋ง ํ ๊ฒฐ๊ณผ๋ฅผ 'cast' ํ์
์ผ๋ก ๋ฐํํจ.
*
* @param dirty Xss-safe ํ ์ํ๋ก ํํฐ๋ง ํ ๋์.
* @param cast Xss-safe ํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ ํ์
.
* @return Xss-safe ํ ๊ฐ์ฒด
* @param <P> ๋ฐํ ๋ ํ์
*/
<P> P doFilter(Object dirty, Class<P> cast);
}
getFilterName()์ @Xss(value = ?)
์ ? ์ ๋งค์นญ๋๋ฉฐ, xss-core๋ ?์ ํด๋นํ๋ ๋ฐํ๊ฐ์ ๊ฐ๊ณ ์๋ XssFilter๋ฅผ ์ฐพ์ filtering์ ์งํํฉ๋๋ค.