ν¨μ€μλλ₯Ό λΉλ‘―ν μ€μλ°μ΄ν°λ₯Ό μνΈνλμ§ μμ νλ¬Έ ν μ€νΈμ ννλ‘ μ μ₯λλ©΄ μνΈκ° μΈλΆμ μ§μ λλ¬λ μ μμ΄ κΈ°λ°μ±μ΄ 보μ₯λμ§ λͺ»νκ³ μνΈκ° μ μ₯λ νμΌμ μ κ·Όν μ μλ μ¬λμ΄λ©΄ λꡬλ μνΈλ₯Ό μμλΌ μ μμ΄ λ¬΄κ²°μ± λν 보μ₯λμ§ λͺ»νλ€.
- κΈ°λ°μ± : λΉμΈκ°μλ€μ μ 보μ λ΄μ©μ μ μ μκ² ν΄μΌ νλ€λ 보μ μμΉ
- λ¬΄κ²°μ± : νκ°λμ§ μμ μκ°(λλ νκ°λμ§ μμ λ°©μμΌλ‘) μ 보λ₯Ό λ³κ²½, μμ , μμ±νλ κ²μ 보νΈν΄μΌνλ€λ 보μ μμΉ
κ°μΈμ 보, κΈμ΅μ 보, ν¨μ€μλ λ± μ€μμ 보λ₯Ό μ μ₯ν λλ λ°λμ μνΈννμ¬ μ μ₯νλ€. μ€μμ 보λ₯Ό μ½κ³ μΈ κ²½μ°μλ νκ°λ μ¬μ©μλ§μ΄ μ¬μ©μ 보μ μ κ·Όνλλ‘ μΈμ¦ κ³Όμ μ κ±°μ³μΌ νλ€.
- μμ νμ§ λͺ»ν μ½λ : μΈμ¦μ ν΅κ³Όν μ¬μ©μμ ν¨μ€μλ μ λ³΄κ° νλ¬ΈμΌλ‘ DBμ μ μ₯λλ€.
String id = request.getParameter("id");
//μΈλΆκ°μ μν΄ ν¨μ€μλ μ 보λ₯Ό μ»κ³ μλ€.
String pwd = request.getParameter("pwd");
// SQLλ¬Έ, ? : λ³μκ° λ€μ΄κ° μ리
String sql = "insert into customer(id, pwd, name, ssn, zipcode, addr)"
+"values(?, ?, ?, ?, ?, ?)"
//μ§μ λ SQL λͺ
λ Ήμ΄λ₯Ό μ€ννλ PreparedStatement μΈμ€ν΄μ€ μμ±
PreparedStatement stmt = con.prepareStatement(sql);
//SQL λ¬Έμμ ? κ°μ λμλλ κ°μ μ§μ ν¨
stmt.setString(1,id);
stmt.setString(2, pwd);
....
//μ
λ ₯λ°μ ν¨μ€μλκ° νλ¬ΈμΌλ‘ DBμ μ μ₯λμ΄ μμ νμ§ μλ€.
stmt.executeUpdate();
- μμ ν μ½λ : ν¨μ€μλ λ± μ€μ λ°μ΄ν°λ₯Ό ν΄μ¬κ°μΌλ‘ λ³ννμ¬ μ μ₯νκ³ μλ€.
String id = request.getParameter("id");
// μΈλΆκ°μ μν΄ ν¨μ€μλ μ 보λ₯Ό μ»κ³ μλ€.
String pwd = request.getParameter("pwd");
// ν¨μ€μλλ₯Ό μνΈκ°μ ν¬ν¨νμ¬ SHA-256 ν΄μλ‘ λ³κ²½νμ¬ μμ νκ² μ μ₯νλ€.
//SHA-256 νμμΌλ‘ μνΈνν κ°μ²΄ μμ±
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
//salt : ν΄μν¨μμμ μΆκ°μ
λ ₯μΌλ‘ μ¬μ©λλ λλ€λ°μ΄ν°
md.update(salt);
//λ°μ΄ν° μ μ²λ¦¬
byte[] hashInBytes = md.digest(pwd.getBytes());
StringBuilder sb = new StringBuilder();
//μ μ²λ¦¬ν λ°μ΄ν°(λ°μ΄νΈ)λ₯Ό ν₯μ¬κ°μΌλ‘ λ³ν
for (byte b : hashInBytes) {
sb.append(String.format("%02x", b)); }
pwd = sb.toString();
......
// SQLλ¬Έ, ? : λ³μκ° λ€μ΄κ° μ리
String sql = " insert into customer(id, pwd, name, ssn, zipcode, addr)"
+ " values (?, ?, ?, ?, ?, ?)";
//μ§μ λ SQL λͺ
λ Ήμ΄λ₯Ό μ€ννλ PreparedStatement μΈμ€ν΄μ€ μμ±
PreparedStatement stmt = con.prepareStatement(sql);
//SQL λ¬Έμμ ? κ°μ λμλλ κ°μ μ§μ ν¨
stmt.setString(1, id);
stmt.setString(2, pwd);
......
//μ
λ ₯λ°μ ν¨μ€μλκ° SHA-256 μκ³ λ¦¬μ¦μ ν΅ν΄ ν΄μκ°μΌλ‘ μ μ₯λμ΄μ μμ νλ€.
stmt.executeUpdate();
πμ½λ μΆκ° μ€λͺ π
-
ν΄λΌμ΄μΈνΈκ° μλ²μκ² λ¬΄μΈκ°λ₯Ό μμ²νλ©΄ μλ²λ μμ²μ ν΄λΉνλ κ²μ μλ΅ν΄μ£Όλ ꡬ쑰μ.
-
ν΄λΉ μ½λλ Servlet μμ€μμ μ¬μ©μμ μμ²μ λν΄ νλΌλ―Έν°λ₯Ό ν΅ν΄ μ¬μ©μ μ 보λ₯Ό μ»μ΄μ DBμ 쿼리λ₯Ό λ λ € μ¬μ©μ μ 보λ₯Ό DBμ μ μ₯νκ³ μλ€.
-
Servlet : μλ° νλ«νΌμμ λμ μΈ μΉμ κ°λ°ν λ μ¬μ©νλ ν΄λμ€λ‘, ν΄λΌμ΄μΈνΈ μμ²μ μ²λ¦¬νκ³ κ·Έ κ²°κ³Όλ₯Ό λ€μ ν΄λΌμ΄μΈνΈμμΈ μ μ‘νλ μλ²μ κΈ°λ₯μ ν΄μ£Όλ μλ° νλ‘κ·Έλ¨
πμ¬μ©λ ν΄λμ€μ λ©μλπ
-
request
- getParameter(name) : http μμ²μ λν΄ nameμ΄λΌλ νλΌλ―Έν° κ°μ μ»κΈ° μν΄ μ¬μ©νλ κ²
ServletRequest (Java(TM) EE 7 Specification APIs)
- getParameter(name) : http μμ²μ λν΄ nameμ΄λΌλ νλΌλ―Έν° κ°μ μ»κΈ° μν΄ μ¬μ©νλ κ²
-
PreparedStatement : SQL ꡬ문μ μ€νμν€λ μν
- executeUpdate() : λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μΆκ°, μμ , μμ νλ SQL λ¬Έμ μ€ν
PreparedStatement (Java SE 11 & JDK 11 )
- executeUpdate() : λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μΆκ°, μμ , μμ νλ SQL λ¬Έμ μ€ν
-
MessageDigest : μνΈνλ₯Ό μν ν΄λμ€
πSHA-256π
-
μνΈν ν΄μ ν¨μμ ν μ’ λ₯
-
ν΄μ ν¨μ : μμμ κΈΈμ΄μ μ 보λ₯Ό μ λ ₯μΌλ‘ λ°μ, κ³ μ λ κΈΈμ΄μ μνΈλ¬Έ(ν΄μκ°)μ μΆ©λ ₯νλ μνΈκΈ°μ
-
λ°μ΄ν° μ μ²λ¦¬, μ΄κΈ°κ° μ€μ , ν΄μ± μ°μ° λ¨κ³λ‘ μ΄λ£¨μ΄μ Έ μμ
- μ λ ₯λ λ°μ΄ν°λ₯Ό μ μ²λ¦¬νλ€.
- μ΄κΈ°κ°μ μ€μ νλ€. (μ΄κΈ°κ° : μκ³ λ¦¬μ¦μ κ²°κ³Όλ‘ λμ¬ ν΄μκ°μ μ΄κΈ°κ°)
- μ΄κΈ°κ°μ μ λ ₯λ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ ν΄μ± μ°μ°μ μννλ€.
- μμ νμ§ λͺ»ν μ½λ : ν¨μ€μλλ₯Ό νμΌμμ μ½μ΄μ μ§μ DB μ°κ²°μ μ¬μ©νκ³ μλ€. μ΄κ²μ ν¨μ€μλλ₯Ό μνΈν νκ³ μμ§ μμμ μλ―Ένλ€.
int dbaccess()
{
FILE * fp; char* server = "DBserver";
char passwd[20];
char user[20];
SQLHENV henv;
SQLHDBC hdbc;
//config νμΌμ μ΄μ΄μ ν΄λΉ μ€νΈλ¦Όμμ user, passwd μ½μ΄μ΄
fp = fopen("config", "r");
fgets(user, sizeof(user), fp);
fgets(passwd, sizeof(passwd), fp);
fclose(fp);
//DBμ μ°κ²°
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLConnect(hdbc, (SQLCHAR*)server, (SQLSMALLINT)strlen(server), (SQLCHAR*)user, (SQLSMALLINT)strlen(user),
/*νμΌλ‘λΆν° ν¨μ€μλλ₯Ό νλ¬ΈμΌλ‘ μ½μ΄λ€μ΄κ³ μλ€*/
(SQLCHAR*)passwd,
(SQLSMALLINT)strlen(passwd));
return 0;
}
- μμ ν μ½λ : μΈλΆμμ μ λ ₯λ ν¨μ€μλλ κ²μ¦μ κ³Όμ μ κ±°μ³μ μ¬μ©νμ¬μΌ νλ€.
int dbaccess()
{
FILE * fp;
char* server = "DBserver";
char passwd[20];
char user[20];
char* verifiedPwd;
SQLHENV henv;
SQLHDBC hdbc;
//config νμΌμ μ΄μ΄μ ν΄λΉ μ€νΈλ¦Όμμ user, passwd μ½μ΄μ΄
fp = fopen("config", "r");
fgets(user, sizeof(user), fp);
fgets(passwd, sizeof(passwd), fp);
fclose(fp);
//ν¨μ€μλ κ²μ¦ κ³Όμ
verifiedPwd = verify(passwd);
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLConnect(hdbc, (SQLCHAR*)server, (SQLSMALLINT)strlen(server), (SQLCHAR*)user, (SQLSMALLINT)strlen(user),
/*νμΌλ‘λΆν° μνΈνλ ν¨μ€μλλ₯Ό μ½μ΄λ€μ΄κ³ μλ€.*/
(SQLCHAR*)verifiedPwd,(SQLSMALLINT)strlen(verifiedPwd));
return 0;
}
πμ¬μ©λ ν¨μπ
- μμ νμ§ λͺ»ν μ½λ : μ¬μ©μλͺ κ³Ό ν¨μ€μλλ₯Ό ν€λ³΄λλ‘λΆν° μ½μ΄μ λ¬Έμμ΄μ κ·Έλλ‘ DB μ°κ²°μ μ¬μ©νκ³ μλ€.
const char * GetParameter(const char * queryString, const char * key);
int main(void)
{
const char* COMMAND_PARAM = "command";
const char* GET_USER_INFO_CMD = "get_user_info";
char* queryStr;
queryStr = getenv("QUERY_STRING");
if (queryStr == NULL)
{
// Error μ²λ¦¬
...
}
char* command = GetParameter(queryStr, COMMAND_PARAM);
if (!strcmp(command, GET_USER_INFO_CMD))
{
const char* USER_ID_PARAM = "user_id";
const char* PASSWORD_PARAM = "password";
const char* userId = GetParameter(queryStr, USER_ID_PARAM);
const char* password = GetParameter(queryStr, PASSWORD_PARAM);
...
char* dbUserId, * dbUserPassword;
//μνΈνλμ§ μμ μ¬μ©μ μ 보λ₯Ό κ·Έλλ‘ DBμ°κ²°μ μ¬μ©νκ³ μμ΄μ μμ νμ§ λͺ»νλ€.
loadDbUserInfo(&dbUserId, &dbUserPassword);
SQLRETURN retcode = SQLConnect(hdbc, (SQLCHAR*)"173.234.56.78", SQL_NTS, (SQLCHAR*)dbUserId, strlen(dbUserId), dbUserPassword, strlen(dbUserPassword));
...
free(userId);
free(password);
}
return EXIT_SUCCESS;
}
void loadDbUserInfo(char** userId, char** password)
{
const int MAX_USER_LENGTH = 8;
const int MAX_PASSWORD_LENGTH = 16;
*userId = (char*)malloc(MAX_USER_LENGTH);
*password = (char*)malloc(MAX_PASSWORD_LENGTH);
FILE * fp = fopen("dbUserInfo.cfg", "r");
fscanf(fp, "%s", *userId);
fscanf(fp, "%s", *password);
}
- μμ ν μ½λ : μΈλΆμμ μ λ ₯λ μ¬μ©μλͺ κ³Ό ν¨μ€μλλ₯Ό loadDbUserInfo ν¨μμμ OAEPν¨λ©μ μ¬μ©ν RSA μκ³ λ¦¬μ¦μΌλ‘ μνΈνν ν DBμ°κ²°μ μ¬μ©νκ³ μλ€.
const char * GetParameter(const char * queryString, const char * key);
const Key decryptPassword="we37kor$^jkl315!#^!"; //private Key
int main(void)
{
const char * COMMAND_PARAM = "command";
const char * GET_USER_INFO_CMD = "get_user_info";
char * queryStr;
queryStr = getenv("QUERY_STRING");
if (queryStr == NULL)
{
// Error
...
}
char * command = GetParameter(queryStr, COMMAND_PARAM);
if (!strcmp(command, GET_USER_INFO_CMD))
{
const char * USER_ID_PARAM = "user_id";
const char * PASSWORD_PARAM = "password";
const char * userId = GetParameter(queryStr, USER_ID_PARAM);
const char * password = GetParameter(queryStr, PASSWORD_PARAM);
...
char * dbUserId, * dbUserPassword;
//loadDbUserInfoλ₯Ό ν΅ν΄ μνΈνλ μ¬μ©μ μ 보λ₯Ό DBμ°κ²°μ μ¬μ©νκ³ μλ€.
loadDbUserInfo(&dbUserId, &dbUserPassword);
SQLRETURN retcode = SQLConnect(hdbc, (SQLCHAR*) "173.234.56.78", SQL_NTS, (SQLCHAR*) dbUserId, strlen(dbUserId), dbUserPassword, strlen(dbUserPassword));
...
free(userId);
free(password);
}
return EXIT_SUCCESS; 32:
}
void loadDbUserInfo(char ** userId, char ** password)
{
const int MAX_USER_LENGTH = 8;
const int MAX_PASSWORD_LENGTH = 16;
*userId = (char *)malloc(MAX_USER_LENGTH);
*password = (char *)malloc(MAX_PASSWORD_LENGTH);
FILE * fp = fopen("dbUserInfo.cfg","r");
fscanf(fp, "%s", *userId);
fscanf(fp, "%s", *password);
//RSA μκ³ λ¦¬μ¦μΌλ‘ μνΈν
RSA_private_decrypt(strlen(decryptPassword), decryptPassword, *password,
RSA_PKCS1_OAEP_PADDDING);
}
πμ¬μ©λ ν¨μπ
πRSA μνΈν μκ³ λ¦¬μ¦π
-
μνΈνμ μ¬μ©νλ ν€μ 볡νΈνμ μ¬μ©νλ ν€κ° λ€λ₯Έ λΉλμΉν€ μκ³ λ¦¬μ¦
-
곡κ°ν€μ κ°μΈν€λ₯Ό μμΌλ‘ μ¬μ©
- 곡κ°ν€ : μΈλΆμ 곡κ°ν μ μλ ν€
- κ°μΈν€ : ν€μ μμ μλ§ μκ³ μμ΄μΌ νλ ν€
- λ³ΈμΈ μΈμ¦μ λͺ©μ μ κ°μ§ λλ κ°μΈν€λ‘ μνΈννκ³ κ³΅κ°ν€λ‘ 볡νΈννλ€.
- κΈ°λ°μ±μ λͺ©μ μΌλ‘ ν λλ 곡κ°ν€λ‘ μνΈννκ³ κ°μΈν€λ‘ 볡νΈννλ€.
-
곡κ°ν€μ κ°μΈν€λ₯Ό λ§λλ κ³Όμ κ³Ό λͺ¨λλ¬ μ°μ°μ ν΅ν΄ μνΈν, 볡νΈννλ κ³Όμ μ΄ νμνλ€.
μΆμ²
γμ μμ λΆ SW κ°λ°, μ΄μμλ₯Ό μν μννΈμ¨μ΄ κ°λ°λ³΄μ κ°μ΄λγ, νμ μμ λΆ, νκ΅ μΈν°λ·μ§ν₯μ
https://docs.oracle.com/javaee/7/api/overview-summary.html
https://docs.microsoft.com/ko-kr/documentation/
https://seed.kisa.or.kr/kisa/Board/21/detailView.do
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://m.blog.naver.com/ka28/221985380809