목록DEV&OPS (244)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Resource Injection 파일이나 소켓 포트 등 외부 입력값을 식별자로 사용하는 경우, 시스템 자원에 임의로 접근하거나 수정할 수 있고 잘못된 입력값으로 인해 시스템이 불안정해질 수 있습니다. 입력 값을 검증하거나 사전에 정의된 리스트에서 선택되도록 작성해 방어합니다. 외부 입력이 파일명인 경우 경로 순회를 수행할 수 있는 문자를 제거해야 합니다. 아래 예제는 외부의 입력을 소켓 번호로 그대로 사용하고 있어 안전하지 않은 예입니다. public void service(){ //외부에서 입력 받은 데이터 String service = props.getProperty("Service No"); int port = Integer.parseInt(service); //외부 입력 값으로 소켓생성 serv..
SQL Injection 사용자의 입력값에 Query를 직접 입력해서 쿼리 구조를 바꾸어 개발자가 의도하지 않은 동작을 수행하게 하는 공격 기법입니다. 예) ID를 guest ' OR 'a'='a' -- 으로 설정 한경우 쿼리가 아래처럼 생성되어 Where절이 항상 참이므로 비번 없이 로그인에 성공할 수 있습니다. SELECT * FROM members WHERE userId='guest' OR 'a'='a' -- AND paseword = ... preparedStatement 클래스를 사용해서 미리 컴파일된 쿼리를 사용해 쿼리를 동적으로 생성할 수 없게 해서 방어합니다. String query = "SELECT * FROM ? WHERE NAME = ?"; pstmt con.prepareStateme..
데이터 무결성 검사 단일 테이블에 대해 무결성 검사를 하려면 mysql> CHECK TABLE 데이터베이스이름.테이블이름; 리눅스 콘솔에서 전체 테이블을 검사 하려면 mysqlcheck -u root -p --check --databases 데이터베이스이름 테이블 무결성 검사는 정기적으로 하는 것을 권장합니다. Optimize 사용하지 않은 공간을 회수합니다. MyISAM 엔진을 쓰는 MySQL에서는 optimize 명령은 단편화 제거 작업만을 수행합니다. InnoDB 엔진을 쓰는 MySQL에서는 ALTER문으로 인덱스를 재생성하도록 요청합니다. 단일 테이블에 대해 optimize 하려면 mysql> OPTIMIZE TABLE 데이터베이스이름.테이블이름; 리눅스 콘솔에서 전체 테이블을 optimize 하..
CRUD 웹 어플리케이션은 서버의 자원을 Create, Read, Update, Delete 하도록 서비스를 구성하는데 이를 줄여서 CRUD라고 합니다. 예를들어 회원 가입(Create), 회원정보조회(Read), 회원정보수정(Update), 회원정보삭제(Delete) 를 한 세트로 묶어서 회원정보에 대한 서버 자원(DB)에 대한 서비스를 구현합니다. 이전 jsp프로젝트 처럼 새 Dynamic Web Project를 생성하여 예제를 구현해보도록 합시다. tomcat의 context path는 / 으로 지정합니다. 프로젝트 생성시 web.xml 생성 옵션을 체크합니다. 프로젝트 src 경로에 controller, dao, service, vo 패키지를 생성합니다. 그리고 .do 요청을 처리하기 위해 프론트..
MVC패턴은 어플리케이션을 Model, View, Controller 으로 작업을 분리해서 모듈간 결합도를 최소화하여 각종 변화하는 상황에 대응하면서도 부작용을 줄이고, 유지보수성도 높일 수 있는 어플리케이션 개발 디자인 패턴을 말합니다. 작업을 모듈별로 나누어 작업하고 이를 결합해 주기 때문에 협업에도 유용하며, 협업시 개발자 자신이 맡은 역할에만 집중할 수 있도록 도와줍니다. View는 클라이언트와 서버간 인터페이스 역할을 하며, 클라이언트 요청을 받고 서버로부터의 결과를 표시해주는 기능을 합니다. Model은 비지니스 로직 서비스와 데이터베이스 처리를 담당합니다. Controller는 View와 Model을 연결해주는 역할을 합니다. 우선 SQL Developer 같은 DB 툴을 이용하여 오라클DB..
JSTL SQL 태그는 많이 사용하지는 않지만 알아두도록 합시다. SQL 기본 액션 : 커넥션 풀 DataSource를 생성하는 태그입니다. var: DataSource 의 설정값을 저장하는 변수의 이름을 지정합니다. dataSource : JNDI 서버에 등록하는 리소스 이름을 지정합니다. scope : 변수의 유효범위를 지정합니다. driver : 로딩할 JDBC 드라이버 정보를 지정합니다. url : 접속할 DB서버의 URL을 지정합니다. userName : DB서버에 로그인할 ID를 지정합니다. password : DB서버에 로그인할 패스워드를 지정합니다. : select 문을 수행하기 위한 태그입니다. sql : 실행할 sql문을 지정합니다. var : select 한 결과값을 ResultSet..
Properties 파일 웹 어플리케이션에서 다국어 지원을 위해 Properties 파일을 이용하는 경우가 많습니다. net.aacii.bundle 패키지를 생성해서 msg_ko.properties와 msg_en.properties 파일을 생성합니다. 이 properties 파일들은 한글의 경우 이클립스에서 자동으로 유니코드로 변환해주는데, 이 properties 파일들을 우클릭 후 open with를 선택 후 텍스트에디터로 열게 되면 한글이 유니코드로 변환되어 있는 것을 확인할 수 있습니다. 만약 자동으로 유니코드로 변환이 되지 않는다면, 이클립스 플러그인 중에 Properties Editor를 설치하시면 됩니다. 이 플러그인 설치 방법은 여기에서 다루지 않겠습니다. msg_ko.properties 을..
오라클 데이터베이스 19c 다운로드 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 파일: Linux x86-64 종류: zip 자신의 운영체제에 맞는 zip 파일을 다운로드합니다. 호스트 네임 등록 root 권한을 획득합니다. su - 호스트 네임을 등록합니다. vi /etc/hosts 리눅스 서버의 ip 주소(192.168.1.6)에 호스트 네임을 정해줍니다. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6...
오라클은 접속 사용자 계정의 패스워드 설정 기본 값이 패스워드를 180일 주기로 변경하도록 되어 있습니다. 만료일이 지나면 다음과 같은 메시지를 확인 할 수 있습니다. oracle: the password has expired. 조치 절차에 대해 설명합니다. 1. 로그인 없이 sqlplus 실행 후 dba 계정으로 접속 sqlplus /nolog connect sys as sysdba 2. 혹은 sqlplus 바로 dba 계정으로 접속 sqlplus / as sysdba 3. passowrd_life_time 값 확인 (기본값 180일) select * from dba_profiles where profile = 'DEFAULT'; 4. 만료일을 unlimited로 변경 alter profile defa..
JSTL(Java Server Pages Standard Tag Library) 개요 자주 사용하는 기능은 커스텀 태그로 구현 한다음 재사용하면 편리합니다. 그러나 커스텀 태그는 직접 만드려면 많은 수고가 필요하게 됩니다. 그래서 표준 태그 라이브러리가 존재하는데 이것이 JSTL 입니다. JSTL 1.0은 Servlet 2.3과 JSP1.2와 호환 JSTL 1.1은 Servlet 2.4와 JSP2.0과 호환 JSTL 1.2은 Servlet 2.5와 JSP2.1과 호환 core는 기본 기능이 포함되어 있으며 formatting은 날짜 시간에 관한 기능, sql은 데이터베이스 작업기능 xml은 xml을 지원하는 기능 functions은 여러 함수 기능이 구현되어 있습니다. core: formatting: s..
PuTTY를 이용해 리눅스(centos)에 SSH 접속할 때 윈도우 컴퓨터에 개인키를 저장해두고 리눅스 서버에 공개키를 저장해서 패스워드 입력 없이 접속하는 방법을 소개합니다. 이 방법은 개인키를 유출되지만 않는다면 아이디 패스워드 로그인 방법보다 보안적으로 안전합니다. 그래서 개인키는 로컬 PC에 저장하되 공용 PC에는 저장하면 안됩니다. PuTTY 와 PuTTYgen 다운로드 링크: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 1. 다운 받은 PuTTYgen 를 실행하고 Generate 버튼을 누릅니다. 마우스를 포인터를 빈칸에서 움직이면 RSA키 쌍이 생성됩니다. 안 움직이면 진행이 안됩니다. 난수를 생성하기 위한 작업입니다. 2..
태그 기반 커스텀 태그는 클래스 기반 커스텀 태그를 선행으로 학습해야 이해하기 쉽습니다. jsp파일에 커스텀 태그 기능을 구현한 다음, 확장자를 tag로 지정하면 하나의 커스텀 태그가 작성된 것입니다. 이 .tag파일이 태그 핸들러 클래스 파일(.class)로 변환되어 동작합니다. 커스텀 태그와 .tag 파일이 하나씩 일대일로 매핑되는것입니다. 또한 .tag파일의 파일명이 jsp페이지에서 사용하는 커스텀 태그의 이름이됩니다. 태그 기반 커스텀 태그는 아래와 같은 절차로 사용합니다. 1. tag 파일을 작성합니다. 저장 위치는 /WEB-INF/tags 폴더 혹은 그 하위 폴더만 가능합니다. 2. jsp 페이지에서 커스텀 태그를 사용하기 위한 taglib 지시자를 선언합니다. 3. 태그 파일을 커스텀 태그로..
커스텀 태그 JSP1.2 버전과의 차이점은 아래와 같습니다. SimpleTag 인터페이스 추가 SimpleTagSupport 클래스 제공 doTag() 메소드로 태그 관련 메소드 통일 JspFragment를 이용한 body 전달 동적 Attribute 추가 방법 제공 기본 예제 net.aacii.customTag 패키지에 MyCustomTag2.java 파일을 생서합니다. package net.aacii.customTag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class MyCustomTag2 extends SimpleTa..
커스텀 태그 태그의 기능을 자바 클래스에서 구현한 다음 jsp 태그와 연결하여 사용할 수 있습니다. 클래스 기반 커스텀 태그를 사용하려면 아래와 같은 요소들이 필요합니다. 1. 태그 핸들러 클래스: 태그가 수행해야 하는 실행문을 구현한 클래스 2. 태그 라이브러리 디스크립터(TLD): xml파일로 확장자를 .tld 하여 클래스 파일과 커스텀 태그를 매칭 3. TLD파일 등록: jsp 컨테이너가 인식 할 수 있도록 web.xml이나 WEB-INF 폴더에 .tld 파일을 등록 4. taglib 지시자: jsp 페이지에서 커스텀 태그를 사용하기 위해서 taglib 지시자를 선언한 후 사용 태그 핸들러 클래스 javax.servlet.jsp.tagext 패키지에 태그 핸들러 클래스를 작성하기 위한 내용들이 있습..
ssh를 이용하면 원격지 컴퓨터에서 centos에 터미널 명령을 실행 시킬 수 있습니다. telnet에 비해 ssh는 암호화된 통신을 하므로 좀 더 안전하다고 할 수 있습니다. SSH설치 1. 루트 권한 획득 su - 2. SSH설치 yum install openssh 3. 서비스 시작 systemctl start sshd.service 4. 서비스 상태보기 systemctl status sshd.service 5. 부팅시 서비스 자동 시작 systemctl enable sshd.service 6. 부팅시 서비스 시작하지 않음 systemctl disable sshd.service 7. 부팅시 실행되는 서비스인지 확인 systemctl is-enabled sshd 8. 서비스 목록 보기 systemctl..