모의 면접 후기
이번 엘리스 모의면접 특강에 면접자로 참여하면서 느낀점은 최대한 많이 이야기하면 좋지만, 제대로 말하지 못하면 차라리 제대로 말할 만큼만 외우고 꼬리질문을 하게 만드는 것이 조금 더 떨지않고 말하는데에 도움이 된다는 것이었다. 단순 CS관련 질문이 아니더라도 내가 개발공부를 하면서 겪은 일들은 꾸준히 기록 해두는 것도 면접때 이야기거리가 될 수 있다는 생각에 포스팅을 더 꾸준히 해야겠다는 생각이 들었다.
면접 준비 내용
1. session 기반 인증과 token 기반 인증의 차이는 무엇인가요?
주요 차이점은 세션 기반 인증은 서버가 세부 사항을 저장하고 토큰 기반은 클라이언트가 토큰을 가지고 있는 형태입니다. 토큰은 대역폭이 크기 때문에 저장해서 사용하는 것보단 대역폭이 작은 세션을 사용하는 편이 좋습니다.
세션 방식은 쿠키를 날린다거나 세션 유효기간이 만료되면 재인증해야 하는 번거로움이 있습니다. 이런 번거로움이 나쁜 것은 아니고 유저의 사용 환경상 웹은 어디서건 접속할 수 있고 본인만 사용하는 PC라는 것을 확인할 수 없기 때문에 적절한 시점에서 로그아웃을 해주는 보안상 안전을 위해 주로 사용됩니다.
앱 사용환경에서는 스마트폰은 자신의 것이라는 컨센서스가 있기 때문에 앱, 서버간 인증에서 매번 로그아웃을 하는 것은 보안 수준이 높아야하는 금융앱 같은 경우를 제외하고 유저에게 번거로운 방식일 수 있습니다.
토큰같은 경우는 탈취를 당하면 강제로 로그아웃 시키거나 만료시키는 방법이 없기 때문에 중복로그인 관리가 민감한 경우 (금융앱, 구독 앱, 모바일 PC체크)에는 세션을 사용해 관리하는게 좋습니다. 하지만 자주 ip가 바뀌는 회사에서 사용하는 서비스일 경우 세션 방식이 중복 로그인을 관리하기는 쉽지 않은 걸로 알고 있습니다.
💡출제 의도
- 두 인증 방법의 차이를 얼마나 알고 있는지
- 어떠한 경우에 해당 인증 방법을 사용하는지를 알고 있는지
- 각 인증 방법의 장단점을 알고 있는지
2. JS진영에서는 callback hell 문제가 종종 발생합니다. 이 문제를 해결하는 방법을 아시는 데로 말씀해주세요.
2. Rest API 설계시 고려해야하는 HTTP메서드 GET과 POST의 차이는 무엇인가요?
- GET은 단순 정보를 요청하는 메서드고 POST는 정보를 제출하는 메서드란 점이 다릅니다. 조회나 검색과 같이 멱등성이 중요한 API인 경우는 GET을 사용하고, 리소스 변경이 필요한 경우는 POST를 주로 사용하지만, GET은 요청시 url에 노출이 되어 보안에는 취약하므로 보안에 예민한 정보 같은 경우는 POST를 주로 이용합니다. 또한 큰 데이터를 전송해야 할 경우 데이터의 길이제한이 없는 POST를 사용하는 것이 적절합니다.
💡출제 의도
- callback hell에 대해서 알고 있는지
- promise와 async/await의 필요성에 대해서 인지하고 있는지
3. 멱등성이란 무엇이며, REST API HTTP method의 4가지 중 멱등성을 보장하는 method는 무엇인지 이유와 함께 설명해보세요.
- 알아야 할 wiki 및 참고 링크
- 내 답안 : 멱등성은 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고 서버의 상태에서도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 합니다. REST API method의 POST를 제외하고 GET, PUT, DELETE가 멱등성을 가집니다. 멱등성이 필요한 이유는 금융 관련 자동이체와 같은 결제 서비스를 이용할 때 중복 이체나 결제를 방지할 수 있기 때문에 안정적인 서비스 제공에 중요한 역할을 합니다.
POST는 새로운 데이터를 제출하므로 서버에 새로운 데이터(새로운 primary ID)가 추가된다고 볼 수 있으므로 멱등성이라 볼 수 없다. GET은 단순 조회 메서드 이므로 서버의 상태에 영향을 주지 않는다. PUT은 같은 primary ID에 같은 요청을 보냄으로 서버의 상태가 동일하게 남는다. DELETE는 한번 삭제후 같은 데이터를 재삭제 할 경우 응답은 404를 받게 되지만 멱등성은 서버 응답 기준이 아니라 상태를 기준으로 하기 때문에 멱등성을 가졌다고 볼 수 있다.
💡출제의도
- REST API에 대해 어느 정도 수준으로 알고 있는가
- HTTP method들에 대해서 알고 있는가
- 멱등성이란 개념이 어떠한 상황에서 필요한지 알고 있는가
4. 프로젝트 기간 중 직면했던 도전 과제와 그 과제를 어떻게 극복하셨는지 말씀 해주실 수 있으실까요?
- 내 답안 : 프로젝트 시 npm 에 올라와있는 passport-kakao 모듈을 이용하여 소셜 로그인을 구현하려 한 적이 있습니다. 해당 라이브러리로 카카오 API의 url scope를 이용해 email을 필수 동의 항목으로 받아오려하였지만 해당 라이브러리를 수정해서 적용하기 쉽지않아 프로젝트 내에서 kakao-passport를 직접 만들어 구현하였습니다. 하지만 생각과는 달리 email은 보안에 중요한 항목이라 kakao API 내에서 제한을 두고 있었고, 소셜 로그인 유저일 경우 email을 따로 입력할 수 있도록 로직을 변경하였습니다. 결론적으로 처음 생각했던 방법과는 다르게 회원 로그인 기능을 완료하였지만 kakao-passport 로직을 직접 구현해보면서 나에게 필요한 외부 라이브러리를 찾아 잘 활용하는 것도 중요하지만 나에게 맞지않는 부분이 있을 때 안되는 부분을 찾아 해당 라이브러리에 이슈를 올리거나 나에게 필요한 부분을 직접 구현하는 것에 자신감이 생긴 거 같습니다.
💡출제 의도
- 문제 해결, 트러블 슈팅, 성능 개선 등 경험에 대한 문제
- 위기 대처 능력이 있는지(위기를 회피하는 사람은 아닌지).
- 프로젝트를 경험하면서 겪었던 문제들을 어떻게 해결했는지.
- 현업에서 일할 때 어떠한 일을 맡겨도 해결해낼 사람인지(이를 통해 성장할 수 있는 사람인지)를 가늠하는 단골 문제.
5. N+1 문제란 무엇이며 이를 해결하기 위한 방법은 무엇인가요?
💡출제 의도
- 웹 서비스 개발에서 자주 직면할 수 있는 DB 쿼리 문제인 본 문제에 대해 인지하고 있는가(DB에 대한 이해도 가늠)
- DB 쿼리/업데이트 최적화는 고려하지 않고 어플리케이션 코드만 생각하는 사람인가를 체크하기 위함
- N+1문제가 DB 쿼리 외의 기타 네트워크 요청에서도 발생할 수 있음을 알고 있는가(예: GraphQL, RESTful API 등)
- 네트워크 요청 자체가 전체적인 서비스에 얼마나 영향을 끼치는지 인지하고 있는가
6. www.google.com을 브라우저에 입력했을 때 어떠한 일들이 일어나나요?
- wiki 및 참고링크 https://velog.io/@tnehd1998/주소창에-www.google.com을-입력했을-때-일어나는-과정#:~:text=1. www.google.com,와 함께 전달을 합니다. https://velog.io/@eassy/www.google.com을-주소창에서-입력하면-일어나는-일
- 내 답안 : 요약 : DNS서버에 IP주소를 조회 → 해당 IP주소를 web server에 요청 → 해당 html 문서에 맞는 웹 페이지 작업 및 db 작업을 web server가 was에게 요청함. //TCP 입력한 URL 주소 중, 도메인 이름에 해당하는 google.com을 DNS에 검색합니다. 가장 가까운 DNS 서버에서 해당 도메인 이름에 해당하는 IP주소를 찾아 사용자가 입력한 URL 정보와 함께 전달합니다. 전달 받은 IP 주소를 이용하여 웹 브라운저는 웹 서버에게 해당 사이트에 맞는 html 문서를 요청합니다. WAS와 데이터베이스에서 웹페이지 작업을 처리합니다. WAS에서의 작업 처리 결과들을 웹 서버로 전송하고, 웹 서버는 웹 브라우저에게 html 문서 결과를 전달합니다. Critical Rendering Path를 통해 웹 브라우저 화면에 웹 페이지 내용을 출력합니다. DOM 트리 , CSSOM 트리를 빌드합니다. Render Tree가 생성되고 Render Tree의 노드들에 대한 위치와 크기를 계산하는 단계로 Layout -> 특정 액션과 이벤트에 따라 Reflow & Repaint가 수행됩니다. 레이아웃과 페인트를 수행하지않고 레이어의 합성만 실행시키는 단계로 Composition이 일어나고나면 www.google.com에 맞는 화면이 웹 브라우저에 출력됩니다.
💡출제 의도
- 브라우저-서버 간의 통신에 대해 얼마나 알고 있는지에 대한 열린 질문
- 네트워크에 대해 얼마나 알고 있는지 가늠이 가능한 문제이기도 하다.