아키텍처와 함께

블로그 이미지
by gregorio
  • Total hit
  • Today hit
  • Yesterday hit

사용자에 대한 password는 Hash를 이용하여 데이터베이스에 저장한다.

일반적으로 Spring framework를 사용하는 경우 BCryptPasswordEncoder를 이용하여 서비스에서 Hash값을 생성하여

데이터베이스에 저장한다.

 

입력한 암호를 Mybatis에 제공하고 있는 TypeHandler를 구현하여 Hash를 생성하여 데이터베이스에 저장하는 

방법이 있다.

 

Mybatis의 TypeHandler의 구현체를 생성한다.

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import com.lgcns.spring.crypt.PasswordEncoder;

public class PasswordHandler implements TypeHandler{


@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
/** Password Encoding **/
String encodePassword = null;
try {
encodePassword = PasswordEncoder.encode(parameter);
} catch (Exception e) {
String errmsg = String.format("Fail to encrypt passwod :: [%s]", parameter);
throw new SQLException(errmsg);
}

ps.setString(i, encodePassword);
}

@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}

@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}

@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return  cs.getString(columnIndex);
}
}

본 예제에서는 setParamter 메소드에서 Hash를 생성하여 PreparedStatement에 Hash 값을 저장한다.

INSERT INTO USERS 
( USERNAME
  ,USER_ROLE_ID
  ,PASSWORD
  ,ENABLED
  ,CREATE_TIME
  ,CREATE_BY
  ,PAGE_ALLOWED )
VALUES ( 
#{username}
  , #{userRoleId}
  , #{password, typeHandler=com.lgcns.spring.mybatis.handler.PasswordHandler}
  , #{enabled}
  , #{createTime}
  , #{createTime}
  , #{pageAllowed} )

SQL에서 password 컬럼에 TypeHandler를 정의하면 TypeHandler에 정의되어 있는  setParameter에서 Return한 값을 데이터베이스에 저장한다.

 

Mybatis의 TypeHanlder를 이용하여 다야한 Masking 처리도 가능하다. 특히 카드번호, 주민번호 등 Masking 처리가 필요한 경우 적용하면 개발 시 편의성과 생산성이 향상될 수 있다.

AND

ARTICLE CATEGORY

분류 전체보기 (56)
Spring Framrwork (33)
Linux (1)
APM (1)
Java (8)
python (0)
ant (1)
chart (1)
OS (1)
tomcat (1)
apache (1)
database (0)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

ARCHIVE

LINK