CORS란 무엇이고 어떻게 허용할 수 있나요?
CORS란 브라우저에서 다른 출처의 리소스를 공유하는 방법입니다.
CORS가 없이 모든 곳에서 데이터를 요청할 수 있게 된다면, 다른 사이트에서 원래 사이트를 흉내 낼 수 있게 됩니다.
만약 기존 사이트와 완전히 동일하게 동작하도록 하여 사용자가 로그인을 하도록 유도하고, 로그인했던 세션 또는 토큰을 탈취하여 악의적으로 정보를 꺼내오거나 다른 사용자의 정보를 입력하는 등 해킹을 할 수 있게 됩니다.
이런 공격을 할 수 없도록 브라우저에서 보호하고, 필요한 경우에만 서버와 협의하여 요청할 수 있도록 하기 위해서 CORS가 필요합니다.
CORS를 허용(사용)할 수 있는 방법에는 두 가지가 있습니다.
simple request인 경우와 preflight 요청일 경우로 나뉩니다.
먼저 simple request인 경우 서버로 요청을 한 뒤, 서버의 응답이 왔을 때 브라우저가 요청한 origin과 응당한 Access-Control-Request-Header의 값을 비교하여 유효한 요청이라면 리소스를 응답하고, 유효하지 않은 요청이라면 브라우저에서 막고 에러를 발생시킵니다.
Preflight 요청의 경우 Origin헤더에 현재 요청하는 origin과, Access-Control-Request-Method 헤더에 요청하는 http method와 Access-Control-Reqeust-Headers 요청 시 사용할 헤더를 oprints 메서드로 서버에 요청합니다.
이때 내용물은 없이 헤더에만 전송됩니다. 이후에 browser가 서버에서 응답한 헤더를 보고 유요한 요청인지 확인합니다.
만약 유효하지 않은 요청이라면 요청은 중단되고 에러가 발생합니다. 유효한 요청이 아니라면 요청은 중단되고 에러가 발생합니다. 만약 유요한 요청이라면 원래 요청으로 보내려던 요청을 다시 요청하여 리소스를 응답받습니다.
예상되는 꼬리 질문
- simple requset란 무엇인가요?
- origin이란 무엇인가요?
- Access-Control-Request-Headers와 Access-Control-Request-Method의 차이점을 설명해 주세요.
- preflight 요청은 무엇인가요?
- Origin 헤더는 무엇인가요?
오버로딩과 오버라이딩에 대해 설명해 주시고 각각 어떤 상황에서 활용할 수 있는지 말씀해 주세요.
오버로딩과 오버라이딩의 공통점은 자바에서 다형성을 지원하는 메서드라는 점입니다.
오버로딩이란 같은 이름의 메서드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술입니다.
메서드 오버로딩과 생성자 오버로딩은 같은 개념입니다. 같은 이름의 메서드를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 됩니다.
먼저 오버라이딩이란 상위 클래스가 가지고 있는 메서드를 하위 클래스로 상소괴는 것처럼 상위 클래스가 가지고 있는 메서드를 재정의해서도 사용할 수 있습니다. 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같은 경우에 상속받은 메서드를 덮어쓰는 개념입니다.
부모 클래서의 메서드는 무시하고 자식 클래스의 메서드 기능을 사용하겠다와 같습니다.
오버로딩은 같은 동작을 해야 하는 메서드를 작성해야 하는데 매개변수가 다른 경우에 사용됩니다.
오버라이딩은 상속받은 메소드를 다시 정의하고 싶을 때 사용됩니다.
배열, 링크드리스트를 비교하여 설명해 주실 수 있을까요?
먼저 배열은 특정크기만큼 연속된 메모리 공간에 데이터를 저장하는 자료구조입니다.
배열의 장점은 연속된 공간이라는 점에 있습니다.
연속된 공간에 데이터들이 나열되어 있기 때문에 배열 원소중 첫 원소의 주소값만 알고 있어도 가른 원소의 위치도 쉽게 빠르게 알 수 있습니다.
결과 배열은 랜덤으로 접근하는 것도 가능해지고, 데이터를 가져오는 속도도 빠릅니다.
연결 리스트는 배열과 달리 연속된 메모리 공간에 저장되어 있지 않습니다. 각각의 데이터가 메모리 공간 상에 고유한 노드로 존재합니다.
그리고 이 노드는 자신의 앞에 있는 데이터와 뒤에 있는 데이터에 대한 주소를 기억하고 있습니다.
따라서 배열과 달리 랜덤으로 데이터를 받아올 수 없습니다.
해당 값의 주소를 알려면 앞이나 전의 데이터 주소값을 알고 있어야 하기 때문입니다.
결과 데이터값을 가져오는 데 걸리는 시간은 배열이 연결 리스트보다 훨씬 빠릅니다.
하지만 연결리스트는 런타임 환경에서 메모리가 할당되는 동적 메모리 할당이 가능해집니다.
또한 배열은 Stack 영역에 메로리 할당이 되고, 연결 리스트는 Heap 영역에 할당됩니다.
예상 꼬리 질문
- 노드란 무엇이고 어떻게 사용되나요?
- 노드는 앞에 있는 데이터와 뒤에 있는 데이터에 대한 주소를 기억하고 있다고 하셨는데 연결 리스트 방식 중 다른 방식은 없나요?
- Stack과 Heap역역의 차이점을 설명해 주세요.
앞으로 3개월, 6개월, 1년 동안 어떤 것을 공부할 계획인지, 그리고 그러한 계획을 세운 이유는 무엇인지 알려주실 수 있을까요?
취업을 해냈다는 가정 하에 말씀을 드리자면
취업한 이후의 3개월은 회사에 적응하고 일처리를 해내는데 중점을 두어 살아갈 것 같습니다.
당연시되는 사내 규칙과 인간관계에 있어 화를 불러일으키지 않게 신경을 많이 쓸 것 같습니다.
6개월 차가 된다면 회사일과 병행하여 현재 같이 공부한 형 누나들과 만나 각자 다른 곳에서 다른 스타일로 배워온 기술을 공유하고 싶습니다.
지금까지는 같이 공부하여 아는 기술들이 비슷한 경우가 많지만 그때쯤이면 다들 각자의 회사일을 하며 배워온 기술이 있을 것이고 저는 그것들을 전부 흡수해 제 것으로 만들고 싶습니다.
1년 차가 된다면 스터디를 이끌어보고 싶습니다.
저는 공부는 함께하면 더 오랫동안 즐겁게 할 수 있다고 생각합니다. 하지만 그중에서도 누군가를 알려주는 것이 가장 기억에 오래 남았습니다.
이러한 제 공부 마인드가 이러한 1년까지의 이러한 목표를 잡게 되는 것 같습니다.
Garbage Collector의 역할, 원리, 알고리즘에 대해 아는 만큼 설명해 주실 수 있을까요?
GC는 잦은 메모리 이슈가 까다로운 개발 환경에서 벗어나기 위해 등장했습니다.
gc는 더 이상 사용하지 않는 메모리 영역을 알아서 해제, 가용상태로 돌려주는 기술입니다.
GC는 지워도 되는 메모리와 지우면 안 되는 메모리로 나뉩니다.
가비지 컬랙션은 특정 객체가 Garbage인지 아닌지를 판단하기 위해서 도달성, 도달능력이라는 개념을 적요합니다.
객체에 유효한 레퍼런스가 없다면 Unreachable(지워도 되는 메모리)로 구분해 버리고 수거합니다.
레퍼런스가 있다면 Reachable(필요한 메모리)로 구분합니다.
이렇게 Reachable과 Unreachable 상태로 나누어진 오브젝트들은 gc의 알고리즘과 구현방식에 의해 이동, 압축 및 삭제를 합니다.
예상 꼬리 질문
- 프로젝트의 경험에서 잦은 메모리 이슈가 까다로웠던 적이 있다면 어떤 일이 있었는지 알려주세요.
- 가용상태란 무엇을 말하는 건가요?
- 도달성과 도달능력에는 어떠한 차이점이 있나요?
- 레퍼런스가 무엇인가요?
- Reference Type은 무엇인가요?
- Reference Type에는 3가지가 있습니다.
- Strong Reference는 null을 대입하지 않는 이상 gc 대상으로 취급되지 않습니다.
- Weak Reference는 항상 gc의 대상이 되게 합니다
- Phantom Reference는 올바르게 삭제하고 삭제 이후 작업을 조작하기 위한 타입입니다. 앞서 말한 스트롱과 위크와 다르게 사용하자 finalize 메서드에 의해 컨트롤할 수 있습니다.
- 즉 Reference Type은 GC가 Reachable과 Unrechable을 어떻게 구분할 것인지 개발자가 설정해 주는 것입니다.
- Reference Type에는 3가지가 있습니다.
프로젝트에서 redis 사용 이유와 redis의 특징을 말해주세요.
저희는 이메일 인증에 필요한 사용자의 이메일과 전송된 인증코드 두 가지를 저장하는데 redis DBMS를 사용하였습니다.
저장, 삭제가 반복되는 휘발성 데이터로 저장이 되어야 하고, 인증하는데 속도의 이슈로 인증이 되지 않는 것이 가장 큰 문제점이 될 것이라는 것을 초점에 두어 redis를 사용하였습니다.
redis의 특징으로는 redis는 인메모리 데이터 구조 저장소이기 때문에 빠른 속도를 가지고 있고, 데이터값을 캐시 화하여 최소한의 비용으로 반복적인 접근이 가능합니다. 단점으로는 많은 큰 용량을 사용하는 데에는 무리가 있습니다.
저희 프로젝트에서 앞서 말한 두 가지 장점과 일치하고 두가지 휘발성 데이터만 저장하는 데에는 큰 용량이 필요 없기 때문에 redis를 채용하였습니다.
예상 꼬리 질문
- 키값 구조란 무엇인가요?
- 비정형 데이터가 무엇인지 알고 계신가요?
- 비관계형 데이터베이스란?
- 인메모리 데이터란 무엇인가요?
'🥸 CS 면접 스터디' 카테고리의 다른 글
웹 애플리케이션이란 무엇일까? (0) | 2023.04.24 |
---|---|
UNIX란? (0) | 2023.04.24 |
CS 스터디 4회차 정리 (1) | 2023.03.15 |
CS 면접 스터디 정리 3회차 (0) | 2023.03.10 |
CS 면접 스터디 2회차 (1) | 2023.03.10 |