개인적으로는 로그인 인증 유지 및 토큰이었다고 생각한다. accesstoken만 사용하는게 아니라 편리한 인증 유지를 위해 refresh token의 재발급을 하기로 했는데, 일반적으로는 refresh token이 쿠키로 저장되면, 자동으로 전송한다는 이점이 있어서 쿠키에 담아서 전송하고자 했는데 이는 https 를 꼭 적용해야만 하는 이유가 되었다.

이를 위해 없던 시간에서도 cloudFront를 이용해 웹에 https를 적용하였고, 안전한 요청 처리를 위해 로드밸런서를 도입하며 서버 쪽에서도 https로 통신할 수 있게 처리하였다.

[CS(기술) 면접 내용 정리]

  1. ORM이 무엇인지 설명해 주세요.

    ORM은 객체 관계 매핑(Object-Relational Mapping)의 약어로, 객체 지향 프로그래밍 언어와 관계형 데이터베이스를 연결해주는 기술입니다.

    객체지향 언어에서는 클래스와 객체를 사용하여 데이터를 추상화하고, 관계형 데이터베이스는 테이블과 레코드로 데이터를 저장합니다. ORM은 이러한 불일치를 해결하기 위해 객체와 테이블을 매핑하여 개발자가 SQL 쿼리를 직접 작성하지 않고 객체를 통해 데이터베이스에 접근할 수 있게 해줍니다.

  2. Foreign Key와 Primary Key에 대해 설명해주세요.

    Primary Key는 테이블에서 각 행(row)을 고유하게 식별하기 위한 열(column)이며, Foreign Key는 다른 테이블의 Primary Key를 참조하는 열입니다.

  3. Client Side Rendering 과 Server Side Rendering 의 차이점에 대해서 설명해주세요.

    Client Side Rendering은 웹 브라우저에서 페이지를 렌더링하는 방식으로, 초기 로딩 속도는 빠르지만 SEO, 초기 구동 시간, 검색 엔진 최적화 등의 문제점이 있습니다. Server Side Rendering은 서버에서 페이지를 렌더링하여 클라이언트에게 전송하는 방식으로, 초기 로딩 속도가 느리지만 SEO, 초기 구동 시간, 검색 엔진 최적화 등의 문제점이 개선됩니다.

  4. URL과 URI의 차이점이 무엇인가요?

    URI는 통합 자원 식별자(Uniform Resource Identifier)의 약어로, 인터넷에 있는 자원을 나타내는 식별자이며, URL은 통합 자원 지시자(Uniform Resource Locator)의 약어로, 인터넷 상에서 웹 페이지나 파일이 위치한 주소입니다.

  5. REST API란 무엇인가요?

    REST API는 Representational State Transfer의 약어로, HTTP를 기반으로 클라이언트와 서버 간 데이터를 주고받는 인터페이스 설계 원칙입니다.

    HTTP Method(GET, POST, PUT, DELETE 등)를 통해 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다

    RESTful하다는 것은 웹 상의 자원을 이름(자원의 표현)과 값(자원의 상태)으로 구분하고, HTTP Method를 통해 자원을 처리하는 아키텍처 스타일을 의미합니다.

    즉, 웹의 기존 인프라를 그대로 활용하여 구현하는 것으로, → URI만으로 자원을 구분하고, HTTP Method를 통해 자원을 처리하므로 구조가 단순하고 확장성이 높은 아키텍처 스타일을 의미합니다.

  6. CORS가 무엇이고, CORS 정책을 Spring Security에 설정하는 방법에 대해서 설명해 주세요.

    CORS는 Cross-Origin Resource Sharing의 약어로, 웹 브라우저에서 다른 도메인의 자원을 요청하는 것을 제한하는 보안 정책입니다. Spring Security에서는 WebSecurityConfigurerAdapter 클래스를 상속받아 @Configuration 어노테이션을 이용하여 CORS 설정을 구현할 수 있습니다.

  7. 인증(Authentication)과 인가(권한 부여, Authorization)의 차이에 대해 설명해 주세요.

    인증은 사용자가 누구인지 확인하는 과정이며, 인가는 사용자에게 특정한 권한을 부여하는 과정입니다.

    인증은 사용자가 자신이 주장하는 신분을 검증하는 과정입니다. 사용자의 신분을 확인하기 위해 보통 사용자 ID와 비밀번호를 이용하거나, 바이오메트릭 인증, OTP 등의 다양한 인증 수단을 사용합니다.

    반면, 인가는 인증된 사용자에게 특정한 권한을 부여하는 과정입니다. 즉, 인가는 사용자에게 접근 권한을 부여하고, 권한이 없는 경우 접근을 차단합니다. 사용자의 권한은 일반적으로 역할(Role)과 권한(Permission)으로 구분됩니다. 예를 들어, 일반 사용자는 게시글을 읽을 수만 있지만, 관리자는 게시글을 수정, 삭제할 수 있는 권한을 가지게 됩니다.

  8. 세션과 쿠키 그리고 토큰 인증 방식에 대해 설명해 주세요.

    세션은 서버에 사용자 정보를 저장하는 방식으로, 쿠키는 클라이언트에 정보를 저장하는 방식으로, 토큰은 사용자 인증 정보를 안전하게 전달하기 위한 방식으로 사용됩니다.

    세션(Session)

    쿠키(Cookie)

    토큰(Token)

    인증인가 방식으로 JWT를 사용했는데 왜 JWT를 사용했어요?

    1. Stateless: JWT는 서버에서 세션을 유지하지 않으므로, 서버의 확장성과 부하 분산이 용이합니다.
    2. Cross-Domain: JWT는 헤더에 토큰을 포함시켜 요청을 보내므로, 다른 도메인 간 통신에도 적합합니다.
    3. Security: JWT는 불변성을 가지며, 서명을 사용하여 위조 방지가 가능합니다.
    4. Decentralized: JWT는 발급된 클라이언트와 서버만 알고 있으면 되기 때문에, 인증 서버의 부담을 줄일 수 있습니다.

    Refresh 토큰은 쿠키에, Access 토큰은 헤더에 담아서 보내기로 결정했다고 하셨는데 이유가 있나요?

    Refresh 토큰은 유효기간이 긴 토큰이므로 쿠키에 저장하는 것이 보안상 안전합니다. 반면, Access 토큰은 유효기간이 짧고 매 요청마다 전송되어야 하는 토큰이므로 HTTP 요청 헤더에 담아서 전송하는 것이 적합합니다. 또한, 헤더에 담아서 전송하면 API Gateway나 Reverse Proxy와 같은 중간 매체에서 캐싱이나 로드밸런싱을 수행하기 용이하며, 이러한 기능들이 웹 어플리케이션의 확장성과 성능에 큰 도움을 줄 수 있습니다.

    Refresh token은 유효기간이 긴 토큰인건 알겠어. 근데 왜 쿠키에 저장하는게 안전한거지?

    쿠키가 HTTP only 및 Secure 플래그를 사용할 수 있기 때문입니다. HTTP only 플래그를 사용하면, JavaScript 코드에서 쿠키에 접근할 수 없으므로 XSS 공격에 취약하지 않습니다. Secure 플래그를 사용하면, 쿠키가 HTTPS 프로토콜을 통해서만 전송되므로 중간자 공격에 대한 보호가 강화됩니다. 또한, 쿠키는 브라우저가 자동으로 관리해주기 때문에 서버 측에서 별도의 관리를 할 필요가 없습니다. 따라서 서버 측에서 Refresh token을 저장하고 관리하기 보다는, 쿠키를 사용하여 클라이언트 측에서 안전하게 저장하고 관리할 수 있습니다.

    Access token은 주로 HTTP 요청 헤더에 포함시켜 전송합니다. 이는 HTTP 요청의 본문과는 별도로 전송되기 때문에 쿠키를 사용하지 않아도 되며, 일반적으로 Access token의 유효기간은 상대적으로 짧기 때문에 쿠키보다는 헤더에 저장하는 것이 적합합니다. 또한, 쿠키의 경우 요청 시마다 자동으로 서버로 전송되는 반면, 헤더의 경우 요청마다 수동으로 전송해야 하므로 보안상 이점이 있습니다.

  9. 패스워드를 암호화 하는 단방향 암호화에 대해서 설명해 주세요.

    단방향 암호화는 암호화된 데이터를 복호화할 수 없는 암호화 방식으로, 해시 함수를 사용하여 패스워드를 암호화합니다.

    장점:

    단점:

    Salt(소금)은 암호화된 비밀번호의 보안성을 높이기 위해 사용되는 임의의 데이터입니다. Salt는 일반적으로 원래 비밀번호에 추가되는 랜덤한 문자열로, 같은 비밀번호라도 각각 다른 Salt 값을 사용하면 최종적으로 생성되는 암호화된 비밀번호 값이 다르게 생성되기 때문에 보안성을 높이는 효과가 있습니다. Salt 값을 적용하면 해시 충돌을 예방하고 레인보우 테이블과 같은 공격을 어렵게 만들어 비밀번호를 더 안전하게 보호할 수 있습니다.

    예를 들어 어떤 사람 A와 B가 비밀번호를 qwer로 만들었다. salt를 각각 임의로 만들어서 A의 비밀번호는 암호화 하기 전에 qwerpoiu가 되었고 B의 비밀번호는 암호화 하기 전에 qwerlkjh가 되었다. salt값이 추가된 비밀번호를 암호화하여 해시 충돌을 방지할 수 있으며,

    salt를 DB에 저장하고 추후 입력된 비밀번호에 대해 저장된 salt값을 사용해 검증할 수 있다.

  10. 트랜잭션에 대해 설명해주세요.

데이터를 조작하는 작업을 수행할 때 일관성(Consistency)을 유지하기 위한 작업 단위

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행되는 작업 단위로, ACID 원칙(원자성, 일관성, 고립성, 지속성)을 준수하여 데이터의 정합성을 보장합니다.

트랜잭션은 보통 다음과 같은 성질을 가집니다.

  1. 원자성(Atomicity) : 트랜잭션 내에서 수행된 작업은 전부 반영되거나 전부 반영되지 않아야 합니다.
  2. 일관성(Consistency) : 트랜잭션 수행 전과 후에 데이터베이스의 일관성이 유지되어야 합니다.
  3. 격리성(Isolation) : 여러 개의 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 서로 독립적으로 수행되어야 합니다.
  4. 지속성(Durability) : 트랜잭션이 성공적으로 수행되면 그 결과는 영구적으로 유지되어야 합니다.

트랜잭션은 보통 다음과 같은 명령어로 사용됩니다.

  1. BEGIN TRANSACTION : 트랜잭션을 시작합니다.
  2. COMMIT : 트랜잭션을 완료하고 변경 내용을 데이터베이스에 반영합니다.
  3. ROLLBACK : 트랜잭션을 취소하고 변경 내용을 롤백합니다.

트랜잭션을 사용함으로써 데이터베이스의 일관성과 안정성을 보장할 수 있습니다. 하지만 트랜잭션은 처리 속도가 느려질 수 있으며, 동시성이 높은 경우 데드락(Deadlock) 등의 문제가 발생할 수 있습니다. 따라서 트랜잭션의 사용은 상황에 따라 적절히 결정해야 합니다.

트랜잭션 처리 속도가 느려질 수 있는 이유는 주로 다음과 같습니다.

  1. 데드락: 여러 개의 트랜잭션이 서로 필요한 데이터를 점유하고 있어, 서로 대기하며 처리 속도가 느려지는 현상입니다.

  2. 블로킹: 하나의 트랜잭션이 특정 데이터를 점유한 상태에서, 다른 트랜잭션이 해당 데이터를 사용하려고 대기하는 현상입니다. 이때 다른 트랜잭션은 대기 상태에 머무르게 되어 처리 속도가 느려집니다.

  3. 너무 많은 트랜잭션 처리: 동시에 처리해야 하는 트랜잭션이 많아질수록 처리 속도가 느려질 수 있습니다. 이 경우에는 데이터베이스 자원을 효율적으로 사용하도록 설계해야 합니다.

  4. 데이터베이스 잠금: 트랜잭션이 데이터를 변경하는 경우, 해당 데이터에 잠금이 걸리는데 이때 다른 트랜잭션이 해당 데이터를 사용하려면 대기해야 합니다. 이때 잠금이 오래 지속될수록 처리 속도가 느려집니다.

  5. 재귀 함수와 반복문의 차이점에 대해 설명해주세요.

    재귀 함수는 함수 내에서 자신을 다시 호출하는 함수입니다. 반복문은 조건문을 만족할 때까지 코드 블록을 반복 실행합니다.