For job interview, about Web 면접 공부하기-웹 3
1. 대칭키와 비대칭키 차이
1. Symmetric-key cryptography 대칭키 암호화
- Definition 정의 : 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘
- Features 특징
- 공개 키(비대칭키) 암호와 비교하여 계산 속도가 빠르다.
- 많은 암호화 통신에서 비밀 키 암호를 사용하여 대칭 키 암호의 공통 키를 공유하고, 그 키를 기반으로 실제 통신을 암호화하는 구조를 사용한다.
- 각 쌍의 사용자들마다 유일한 키가 생성되어 다수의 쌍이 존재할 경우 키의 수가 증가되고 이로인해 키 관리가 어렵다.
- 종류
- 스트림 암호 : 연속적인 비트/바이트를 계속해서 입력받아, 그에 대응하는 암호화 비트/바이트를 생성하는 방식
- 블록 암호 : 정해진 한 단위(블록)를 입력받아, 그에 대응하는 암호화 블록을 생성하는 방식
2. Public-key / Asymmetric-key cryptography 공개키/비대칭키 암호화
- Definition 정의 : 암호화와 복호화에 상이한 암호 키를 쓰는 알고리즘
- Features 특징
- 공개키와 비밀키가 존재하며, 공개키는 누구나 알 수 있지만 그에 대응하는 비밀키는 키의 소유자만이 알 수 있다. (공개키로 암호화한 것을 개인키로 복호화한다.)
- 대칭키 암호보다 계산이 복잡하한 단점이 있기 때문에 대칭키 암호와 함께 사용된다. (예. 메시지는 대칭키를 이용해 암호화 한 다음 이 대칭키를 다시 수신자의 비대칭키/공개키로 암호화하여 메시지와 함께 전송한다. 그러면 공개키 암호 기술로 짧은 대칭키만을 암호화하고, 효율적인 대칭키 암호 기술로 전체 메시지를 암호화한다.)
- 전자 서명 및 사용자 인증 등에 사용된다.
2. SSL (Secure Sockets Layer)
- 서버/웹 서버 인증이라 불리는 프로토콜을 말하며, 클라이언트와 서버 간 통신에서 정보를 암호화하기 때문에 공격자의 감청으로 정보가 유출되더라도 정보의 내용을 보호할 수 있게 해주는 보안 솔루션이다.
3. 보안 취약점
1. Cross-site scripting (XSS) 크로스사이트 스크립팅
- Definition 정의 : 웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도하여 정보 유출 등의 공격을 할 수 있는 보안 약점이다.
- Solution 해결법 : 입력한 문자열에서 특수문자를 replaceAll() 적용하여 치환한다.
- Example 예제 ```java String name = request.getParameter(“name”); …
NAME:<%=name%>
이면 name에 `<script>alert(document.cookie);</script>` 포함시키면 공격자에게 피해자의 쿠기 정보가 전송된다.
따라서, 다음과 같이 코드를 수정해야 한다.
```java
String name = request.getParameter("name");
if(name != null) {
name = name.replaceAll("<", "$lt");
...
}
2. SQL(Structured Query Language) Injection
- Definition 정의 : DB와 연동된 웹 어플리케이션에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점이다.
- Solution 해결법 : 개발 단계에서부터 모든 입력값에 대한 적절한 검증절차를 설계하고 구현해야 한다.
3. Brute Force Attack 무차별 대입 공격
- Definition 정의 : 가능한 모든 암호 조합을 무차별 시도하는 다소 기초적인 방식의 해킹 공격으로, 공격자는 대입에 소요되는 시간을 줄이기 위해 사전에 있는 단어를 우선 시도하는 이른바 ‘사전 공격’을 수행하기도 한다.
- Solution 해결법 : 브루트 포스 공격에 대비한 암호 생성 및 공격 사전 차단이 필요하다.
4. Password-Based Encryption 비밀번호 암호화
1. One-way hash function 단방향 해시 함수
- 수학적인 연산을 통해 원본 메시지를 변환하여 암호화된 메시지인 다이제스트 digest 를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어야 하며 이를 ‘단방향성’이라고 한다.
- 문제점
- 인식 가능성(recognizability) : 공격자가 전처리된 다이제스트를 가능한 한 많이 확보한 다음 이를 탈취한 다이제스트와 비교해 원본 메시지를 찾아낸다. Rainboow Attack.
- 속도 : 해시 함수의 빠른 처리 속도로 인해 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다.
2. 단방향 해시 함수 보완 방법
- Salting 솔팅 : 솔트는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열로, 이 원본 메시지에 문자열을 추가하여 다이제스트를 생성하는 것을 솔팅이라고 한다. 이 방법을 사용하면, 공격자가 비밀번호의 다이제스트를 알아내더라도 솔팅된 다이제스트를 대상으로 비밀번호 일치 여부를 확인하기 어렵다. 또한, 사용자별로 다른 솔트를 사용한다면 동일한 비밀번호를 사용하는 사용자의 다이제스트가 다르게 생성되어 인식 가능성 문제가 크게 개선된다.
- Key stretching 키 스트레칭 : 입력한 비밀번호의 다이제스트를 생성하고, 이것에 또 다이제스틀 생성하고, 이를 계속 반복하는 방법으로 입력한 비밀번호를 동일한 횟수만큼 해시해야만 입력한 비밀번호의 일치 여부를 확인할 수 있다.
- Adaptive Key Derivation Functions
- PBKDF2
- bcrypt
- scrypt
5. HTTP caching 캐싱
1. 웹 캐시의 종류
- Browser cache : 브라우저 혹은 클라이언트 어플리케이션이 내부적으로 가지고 있는 캐시
- Proxy cache : 실제 서버가 있는 곳이 아닌 네트워크 관리자에 의해 네트워크 상에 설치되는 캐시 (ex. ISP의 방화벽 firewall)
- Gateway cache : 서버 관리자에 의해 실제 서버의 앞단에 설치되는 캐시
2. Cache validation 캐시 유효성 검사
- ETag
클라이언트는 ‘If-None-Match’ HTTP 요청 헤더 내에서 ETag 토큰을 자동으로 제공한다. 서버는 현재 리소스와 비교하여 이 토큰을 검사한다. 토큰이 변경되지 않은 경우, 서버는 ‘304 Not Modified’ 응답을 반환하고 브라우저는 이미 캐시에 있는 동일한 리소스를 사용한다. - Last-Modified : 브라우저는 최초 응답 시 받은 Last-Modified 값을 If-Modified-Since 헤더에 포함시켜 페이지를 요청한다. 서버는 요청 파일의 수정 시간을 If-Modified-Since 값과 비교하여 동일하면 ‘304 Not Modified’ 응답을 반환하고, 다르면 ‘200 ok’와 함께 새로운 Last-Modified 값을 응답 헤더에 전송한다. 그리고 브라우저는 새로 리소스를 다운받고 Last-Modified 값을 갱신한다.
3. Cache expiration 캐시 만료 검사
- Expires : 브라우저는 최초 응답시 받은 Expires 시간을 비교하여 기간 내라면 서버를 거치지 않고 바로 캐시에서 페이지를 로드한다. 기간이 만료되었다면 캐시 유효성 검사 작업을 수행한다.
- Cache-Control
브라우저는 최초 응답시 받은 Cache-control 중 ‘max-age’값(초 단위)을 GMT와 비교하여 기간 내라면 서버를 거치지 않고 바로 캐시에서 페이지를 로드한다. 기간이 만료되었다면 캐시 유효성 검사 작업을 수행한다.
※ 참고 : https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ko, https://www.letmecompile.com/http-cache-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC/, https://cyberx.tistory.com/9, https://www.estsecurity.com/securityCenter/commonSense/view/76, https://d2.naver.com/helloworld/318732, 위키백과