728x90
반응형
개인정보에 해당하는 비밀번호의 경우 개인정보보호법에 의해 암호화를 해야하는데, 이를 위해 암호화 필터가 필요.
db에 비밀번호 그대로 노출되면 관리자가 멋대로 악용하거나 해킹 당했을 때 바로 노출될수 있으므로 암호화 필터가 필요하다.
암호화를 적용해야되는 요청 : 로그인, 회원가입, 비밀번호 변경, 회원 탈퇴
필터가 적용될 url이 여러 개인 경우 : String 배열 초기화 형태로 {}작성
common패키지안에 필터패키지 EncrpytFilter를 만들어준다. (ctrl+n) :filter 검색
@WebFilter(filterName = "encryptFilter", urlPatterns = {"/member/login",
d"/member/signUp"})
public class EncrpytFilter extends HttpFilter implements Filter{
public void init(Filterconfig fConfig) throws DervletException{}
public void destroy(){}
public void doFilter(ServletRequest request, ServletRespopnse response,FilterChain chain) throws IOException, ServletException {
// 비밀번호 파라미터 -> HttpServletRequest에 담겨있음
// doFilter 메소드의 매개변수는 부모타입인 ServletRequest
// -> 다운 캐스팅 필요
HttpServletRequest req = (HttpServletRequest)request;
// 얻어오는건 가능, 세팅은 안됨 wrapper로 감싸면 세팅 추가 가능
// 파라미터를 다시 세팅하는 방법은 필터에서 불가능함
// -> Servlet의 Wrapper 클래스를 이용해서
// HttpServletRequest 메소드를 오버라이딩 할 수 있다
// -> 오버라이딩(제정의)를 통해서 비밀번호 암호화 진행
// wrapper 객체를 생성해서 기존 HttpServletRequest 객체 역할을 대체함
EncryptWrapper wrapper = new EncryptWrapper(req);
// 다음 연결된 필터를 수행(없으면 Servlet으로 이동)
chain.doFilter(wrapper, response);
}
}
EncrptWrapper 클래스를 만들어준다.
package edu.kh.community.common.wrapper;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncryptWrapper extends HttpServletRequestWrapper {
// HttpServletRequestWrapper
// - 클라이언트 요청 객체 HttpServletRequest를 오버라이딩하는 방법을 제공하는 클래스
// -> Wrapper 클래스 생성 시 반드시 HttpServeltRequest를 전달해야 한다
public EncryptWrapper(HttpServletRequest request) {
super(request);
}
// getParameter() 오버라이딩
@Override
public String getParameter(String name) {
// 매개변수 name : input 태그의 name 속성 값
// super.getParameter(name) : 기존 getParameter() 메소드
String value = null;
switch(name) {
case "inputPw" :
case "memberPw" :
value = getSha512(super.getParameter(name));
break;
// 암호화 되는 경우가 아니라면 기존 getParameter() 메소드의 형태를 유지
default : value = super.getParameter(name);
}
return value;
}
// 암호화 메소드(SHA-512 해시 함수)
// 해시 함수 : 어떤 문자열이든 일정한 길이의 무작위한 문자열로 변환하는 함수(중복 X)
private String getSha512(String pw) {
// 매개변수 pw : 암호화 되기 전 비밀번호
String encryptPw = null; // 암호화된 비밀번호 저장
// 1. 해시 함수를 수행할 객체를 참조할 변수 선언
MessageDigest md = null;
try {
// 2. SHA-512 방식의 해시 함수를 수행할 수 있는 객체를 얻어옴
md = MessageDigest.getInstance("SHA-512");
// 3. md를 이용해 암호화를 진행할 수 있도록 pw를 byte[]로 변환
byte[] bytes = pw.getBytes(Charset.forName("UTF-8"));
// 4. 암호화 수행 -> 암호화 결과가 md 내부에 저장됨
md.update(bytes);
// 5. 암호화된 비밀번호를 encyptPw에 대입
// -> byte[]을 String으로 변환해야함
// Base64 : byte 코드를 문자열로 변환하는 객체
encryptPw = Base64.getEncoder().encodeToString(md.digest());
System.out.println("암호화 전 : " + pw);
System.out.println("암호화 후 : " + encryptPw);
} catch (NoSuchAlgorithmException e) {
// SHA-512 해시 함수가 존재하지 않을 때 예외 발생
e.printStackTrace();
}
return encryptPw;
}
}
db에서 로그인했을때 콘솔에 나오는 암호화를 보고 넣어줌
ex))암호화된 비밀번호로 업데이트
UPDATE MEMBER SET MEMBER_PW = 'aBN5hiegXlvAovJLipPoPd5LB+xjPrAeu1tcAVg0p5MKGocvo6l825SD+ZMCOcHBFeGB7MnzH31SAnDzYYsSdg==' WHERE MEMBER_NO = 1;
COMMIT;
꼭 commit 까지 해줄것.
728x90
반응형
'괴발개발 > DB' 카테고리의 다른 글
| DataBass connection pool 커넥션 풀 (DBCP) (0) | 2024.06.27 |
|---|---|
| ORDER BY (0) | 2024.06.01 |
| NULL 연산자 (0) | 2024.06.01 |
| IN 연산자, 연결연산자(||) (0) | 2024.05.29 |
| SQL 연산자 우선순위 (0) | 2024.05.28 |