[Java 풀스택 과정 강의] 3월 16일

부트캠프 일지/Java 풀스택 과정 강의
2026.03.19
※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.
일지이기 때문에 일기의 성격이 더 강합니다.

 

지난 시간에 이어서, 이번엔 저장형 XSS를 다룬다.

 

저장형 XSS

저장형 XSS는 공격 내용이 들어가 있는 스크립트를 DB가 저장하여, 다른 이용자가 해당 페이지(주로 게시판 게시글이 된다)를 열었을 때 그대로 스크립트가 실행되어 공격을 받는 것을 의미한다. 그렇기 때문에 이를 방지하기 위해서는 보통의 경우 스크립트를 이스케이프 처리를 해야한다. JAVA의 경우 C:OUT을 사용하고 있다. 수업에서는 이것을 JSTL과 함께 사용했다.

c:out은 escapeXml이 기본적으로 true 값이기 때문에 escape 처리를 해준다. 만약 escape 처리가 필요 없다면 명시적으로 false 처리를 해야하지만, 추천하지는 않는다.

 

<c:out value='<%= %>'>

 

그리고 출력 전에 이스케이프 형태로 저장(혹은 스크립트는 저장하지 못하도록 처리)하는 것 또한 방지 방법이 된다.

 

 

DOM XSS

DOM XSS는 DOM 구조를 통하여 요소를 수정, 추가, 이동 등을 할 때 js를 넣어 공격한다.

주소창의 매개 변수에 javascript:를 넣어 사용하거나 <script>를 사용하여 공격한다. 우리의 경우 #로 시작하는 해시값을 사용하여 이 DOM XSS를 실험해보았다.

이 경우 해결 방법으로는 매개변수 값의 검증이 있다. 해당 값을 검증하여 이스케이프하거나 필터링하는 등의 방식으로 방지할 수 있다.

 

 

MD5 해싱

MD5 암호는 한때 사용하였던 암호화(정확히는 해싱) 기법으로, 해시 중 하나이다. 현재는 권장되지 않고, SHA256 등을 권장하고 있다. MD5 암호화를 사용하는 법은 다음과 같다.

 

	public static String md5(String pass) {
		String encData = "";

		try {
			MessageDigest md = MessageDigest.getInstance("MD5");

			byte[] bytes = pass.getBytes();

			md.update(bytes);

			byte[] digest = md.digest();
			System.out.println("byte 타입 해시값 : " + digest);

			for (int i = 0; i < digest.length; i++) {
				encData += Integer.toHexString(digest[i] & 0xff);
			}

			System.out.println(encData);

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return encData;
	}

 

들어온 pasword를 getBytes()를 통해 바이트 배열로 바꾸어 받아온다. 그리고 md에 update 메서드를 사용, MessageDigest 안에 넣는다. md.digest를 통해 최종 해시값을 계산, 이것을 byte[] digest로 저장한다. 이후 배열을 사람이 볼 수 있도록 Integer.toHexString을 통해 16진수로 변환한다.

 

 

이 MD5 클래스를 생성해서 사용하면 되는데, 중요한 건 해시는 단방향 암호화이기 때문에 복호화는 불가능하다. 즉, MD5 형태로 저장했을 경우, 검증 과정 또한 같은 MD5를 거쳐야 비교 및 통과가 가능하다.