크로스 사이트 스크립트 (XSS)란 무엇인가?
**크로스 사이트 스크립트(XSS)**는 공격자가 악성 스크립트를 웹 사이트에 삽입하여 사용자 브라우저에서 실행되게 하는 공격 방식입니다. 이로 인해 사용자의 세션, 쿠키, 로컬 스토리지 정보 등을 탈취할 수 있으며, 피싱, 키로깅 등의 악성 행위가 가능해집니다.
왜 XSS 취약점을 조치해야 하는가?
XSS 공격을 방치할 경우 사용자 데이터 유출, 계정 탈취, 악성 스크립트 실행 등의 보안 위험이 발생할 수 있습니다. 따라서 웹 애플리케이션에서는 XSS 취약점을 미리 방지하는 조치가 필요합니다.
XSS 방지 방법
Java에서는 다음과 같은 방법으로 XSS를 방지할 수 있습니다.
- 입력 값 검증: 사용자 입력을 검증하고 불필요한 특수 문자를 제거하여 안전하게 처리합니다.
- 출력 인코딩: HTML로 출력할 때 특수 문자를 인코딩하거나 필요한 경우 변환하여 안전하게 표시합니다.
Java에서 XSS 방지: replace를 이용한 문자 변환
replace 메서드를 사용하여 사용자 입력을 저장할 때 HTML 태그를 안전한 텍스트로 변환하고, 화면에 출력할 때는 원래 형태로 디코딩해 표시할 수 있습니다.
예제: replace를 사용한 문자 변환 및 복구
- 입력 값을 변환하여 저장하기
사용자가 입력한 특수 문자를 안전하게 변환하여 서버에 저장합니다. - 출력 시 원래 형태로 복구하기
저장된 데이터를 화면에 표시할 때는 변환된 특수 문자를 원래 형태로 복구하여 표시합니다.
다음은 Java Spring 환경에서 replace를 이용해 XSS를 방지하는 예제입니다.
Controller 코드
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class XssPreventionController {
// 특수 문자 변환 메서드 (입력값 처리용)
private String sanitizeInput(String input) {
return input.replace("<", "<")
.replace(">", ">")
.replace("&", "&")
.replace("\"", """)
.replace("'", "'");
}
// 특수 문자 복구 메서드 (출력용)
private String restoreOutput(String sanitizedInput) {
return sanitizedInput.replace("<", "<")
.replace(">", ">")
.replace("&", "&")
.replace(""", "\"")
.replace("'", "'");
}
@GetMapping("/submit")
public ModelAndView submitInput(@RequestParam("userInput") String userInput) {
// 입력 값을 변환하여 저장
String sanitizedInput = sanitizeInput(userInput);
ModelAndView modelAndView = new ModelAndView("result");
modelAndView.addObject("userInput", sanitizedInput);
return modelAndView;
}
@GetMapping("/display")
public ModelAndView displayInput(@RequestParam("storedInput") String storedInput) {
// 저장된 값을 복구하여 화면에 표시
String restoredInput = restoreOutput(storedInput);
ModelAndView modelAndView = new ModelAndView("display");
modelAndView.addObject("userInput", restoredInput);
return modelAndView;
}
}
위 예제에서는 sanitizeInput 메서드를 사용해 <, >, &, ", ' 등 XSS 공격에 사용될 수 있는 특수 문자를 변환하여 저장하고, restoreOutput 메서드를 통해 원래 형태로 복구하여 화면에 표시하도록 했습니다.
JSP 예제: 변환된 입력과 복구된 출력
submit 페이지에서 입력을 받으면 변환하여 저장하고, display 페이지에서는 복구된 값을 화면에 표시합니다.
- submit.jsp – 사용자 입력 받기
<form action="/submit" method="get">
<label for="userInput">메시지를 입력하세요:</label>
<input type="text" name="userInput" id="userInput">
<button type="submit">제출</button>
</form>
2. result.jsp – 변환된 입력을 확인하기
<h2>입력 결과:</h2>
<p>${userInput}</p>
<a href="/display?storedInput=${userInput}">원래 형태로 보기</a>
3. display.jsp – 복구된 출력을 표시하기
<h2>복구된 입력 결과:</h2>
<p>${userInput}</p>
위 방식으로 replace 메서드를 사용해 입력값을 안전하게 변환하고 필요할 때 복구하여 보여줌으로써 XSS 공격을 방지할 수 있습니다.
'Develop > JAVA' 카테고리의 다른 글
[Java] 메모리 관리 및 가비지 컬렉션: 개념과 예제 (2) | 2024.11.17 |
---|---|
[Java] 오늘날짜 구하기 날짜 더하기 빼기 (3) | 2024.11.14 |
[Spring Framework] application.yml 파일에서 값 암호화 (7) | 2024.10.28 |
[Java] Spring Security 에서 SameSite 설정방법 (PG사 결제 시 리턴 후 세션 끊김현상 해결) (6) | 2024.10.24 |
[Java] BigDecimal 나누기 소수점 올림, 버림, 반올림 사용방법 (5) | 2024.10.21 |