백엔드 자바 CS 면접 빈출 질문 대비하기 - 스프링

2024. 8. 14. 20:31·면접 준비
목차
  1. 자바(초급+중급) 면접 리스트 보러가기 https://sunro1994.tistory.com/240
  2. Dispatcher Servlet
  3. IoC / DI
  4. AOP
  5. Bean
  6. JPA
  7. Spring Security
  8. JWT
  9. Exception 처리
  10. OAuth2
  11. OAuth2를 사용해본 경험이 있나요?
  12. OAuth2를 어떤 방식으로 구현하셨나요?
  13. OAuth2를 사용하면 어떤 장점이 있나요?
  14. 사용자의 인증 과정에 대해 설명할 수 있나요?
728x90
반응형
SMALL

자바(초급+중급) 면접 리스트 보러가기 https://sunro1994.tistory.com/240

 

백엔드 자바 CS 면접 빈출 질문 대비하기 - 자바 초급+중급

이번에는 면접 리스트편중 자바를 가져왔습니다. 자바의 기초질문들도 같이 공부하는게 좋을것 같아서 쭉 나열해보며 개념을 적었습니다. 틀린 부분은 댓글로 알려주세요 :)https://sunro1994.tistory.

sunro1994.tistory.com

 

내용에 잘못된 부분이 있다면 댓글로 알려주시기 바랍니다:)

 

 

Dispatcher Servlet

Dispatcher Servlet의 동작 원리:

  • DispatcherServlet은 Spring MVC의 프론트 컨트롤러로, 모든 HTTP 요청을 받아 해당 요청을 적절한 컨트롤러로 전달하고, 그 결과를 View로 반환하는 역할을 합니다. 주요 동작 과정은 다음과 같습니다:
    1. 클라이언트가 요청을 보내면 DispatcherServlet이 이를 수신합니다.
    2. 핸들러 매핑(Handler Mapping)이 요청 URL을 기준으로 적절한 컨트롤러를 찾습니다.
    3. 해당 컨트롤러가 요청을 처리하고, 결과를 DispatcherServlet에 반환합니다.
    4. 뷰 리졸버(View Resolver)가 결과를 렌더링할 View를 결정합니다.
    5. DispatcherServlet이 View를 클라이언트에게 반환합니다.

Spring MVC의 동작 구조:

  • Spring MVC는 Model, View, Controller의 세 가지 요소로 구성됩니다. DispatcherServlet이 프론트 컨트롤러로 모든 요청을 받아, 컨트롤러가 모델을 조작하고, 그 결과를 뷰에 전달하여 최종 결과를 생성합니다.

MVC1과 MVC2의 차이:

  • MVC1: Model, View, Controller의 역할이 명확히 구분되지 않고, 주로 JSP에서 모든 처리를 담당하는 구조입니다. 코드 유지보수가 어렵고, 비즈니스 로직이 뷰에 섞여서 응집도가 떨어집니다.
  • MVC2: Model, View, Controller가 명확히 분리되어 각자의 역할에 충실합니다. 컨트롤러는 비즈니스 로직을 처리하고, 모델은 데이터 처리, 뷰는 UI를 담당합니다. 코드의 응집도와 재사용성이 높아지고, 유지보수가 용이합니다.

꼬리 질문:

  • MVC2 구조를 사용하면 어떤 이점이 있는가?
    DispatcherServlet의 가장 중요한 역할은 클라이언트의 요청을 적절한 컨트롤러로 전달하고, 그 결과를 클라이언트에게 반환하는 것입니다. 이는 MVC 패턴의 핵심을 이루는 부분입니다.
  • DispatcherServlet이 요청을 처리하지 못하면 어떻게 되는가?
    DispatcherServlet이 요청을 처리할 수 없을 경우, 기본적으로 404 에러를 반환합니다. 또한, 예외가 발생하면 예외 처리기에 의해 처리되거나, 미처리된 예외는 500 에러를 반환하게 됩니다.

IoC / DI

IoC란?

  • IoC(Inversion of Control, 제어의 역전)는 객체의 생성과 객체 간의 의존 관계를 개발자가 아닌 스프링 컨테이너가 관리하는 개념입니다. 이를 통해 객체의 생명주기와 의존성을 관리하고, 코드의 유연성을 높입니다.

DI란?

  • DI(Dependency Injection, 의존성 주입)는 객체 간의 의존성을 스프링 컨테이너가 주입하는 방식입니다. 필요한 의존성을 외부에서 주입받아 객체 간의 결합도를 낮추고, 코드의 재사용성과 테스트 용이성을 높입니다.

DI를 사용하는 이유는?

  • DI는 객체 간의 강한 결합을 제거하고, 유연한 설계를 가능하게 하며, 코드 테스트와 유지보수를 용이하게 합니다.

DI 유형은?

  • 생성자 주입 (Constructor Injection): 생성자를 통해 의존성을 주입합니다. 불변성과 테스트 용이성 측면에서 선호됩니다.
  • 세터 주입 (Setter Injection): 세터 메서드를 통해 의존성을 주입합니다. 선택적인 의존성을 주입할 때 유용하지만, 불변성이 깨질 수 있습니다.
  • 필드 주입 (Field Injection): 필드에 직접 주입하는 방식입니다. 간편하지만, 테스트하기 어렵고 코드의 가독성이 떨어질 수 있습니다.

DI에서 가장 지양되는 방법과 선호되는 방법, 그 이유는?

  • 지양되는 방법: 필드 주입. 테스트하기 어렵고, 불변성을 보장할 수 없습니다.
  • 선호되는 방법: 생성자 주입. 객체의 불변성을 유지하며, 의존성을 명확하게 드러내고, 테스트가 용이합니다.

꼬리 질문:

  • 생성자 주입과 세터 주입 중 어떤 상황에서 어떤 방법을 선택할 것인가?
    생성자 주입은 필수적인 의존성을 주입할 때, 불변성을 보장할 수 있어 선호됩니다. 세터 주입은 선택적 의존성 또는 외부 설정에 따라 의존성을 변경할 때 사용됩니다.
  • IoC를 사용하지 않는다면 어떤 문제점이 발생할 수 있을까?
    IoC를 사용하지 않으면 객체 생성과 의존성 관리를 코드에서 직접 해야 하며, 이는 객체 간 결합도를 높여 테스트와 유지보수를 어렵게 만듭니다.
  • DI에서 Circular Dependency가 발생하면 어떻게 해결할 수 있는가?
    순환 의존성 문제는 주로 @Lazy 어노테이션을 사용해 지연 로딩으로 해결하거나, 의존성을 적절히 분리하여 해결할 수 있습니다.

AOP

AOP의 주요 용어는?

  • Aspect: 횡단 관심사를 모듈화한 것입니다.
  • Join Point: 프로그램 실행 중에 횡단 관심사가 적용될 수 있는 지점입니다.
  • Advice: 실제로 횡단 관심사가 적용되는 코드입니다.
  • Pointcut: Advice가 실행될 Join Point를 정의합니다.
  • Weaving: Advice를 실제 코드에 삽입하는 과정입니다.

AOP는 어떻게 적용되는가?

  • 스프링에서 AOP는 프록시 패턴을 사용하여 적용됩니다. 런타임에 프록시 객체를 생성하여, 지정된 메서드 호출 전후로 Advice가 실행되도록 합니다.

필터와 인터셉터 중 AOP는 어디에 속하는가?

  • AOP는 필터나 인터셉터와는 다른 개념입니다. 필터와 인터셉터는 주로 HTTP 요청과 응답을 가로채는 데 사용되며, AOP는 메서드 실행 전후에 추가적인 작업을 수행하는 데 사용됩니다.

AOP를 사용했을 때 어떤 이점이 있었는가?

  • AOP를 사용하면 로깅, 보안, 트랜잭션 관리 등 반복되는 횡단 관심사를 분리하여 코드의 중복을 줄이고, 핵심 비즈니스 로직을 깔끔하게 유지할 수 있습니다.

꼬리 질문:

  • AOP를 사용했을 때 성능에 미치는 영향은?
    AOP는 메서드 호출 시 추가적인 작업을 수행하므로 약간의 성능 저하를 초래할 수 있습니다. 특히, 복잡한 포인트컷이나 자주 호출되는 메서드에 적용될 경우 성능에 미치는 영향이 커질 수 있습니다.
  • AOP의 한계점은 무엇인가?
    AOP는 주로 메서드 레벨에서 동작하기 때문에 필드 접근이나 로컬 변수에 대한 조작은 어렵습니다. 또한, 복잡한 로직이 포함된 어드바이스는 코드의 가독성을 떨어뜨릴 수 있습니다.
  • AOP와 프록시 패턴의 차이점은?
    AOP는 프록시 패턴을 사용해 횡단 관심사를 적용하는데, 프록시 패턴이 클래스의 동작을 제어하기 위해 사용되는 반면, AOP는 특정 포인트컷에서만 관심사를 적용하는 데 초점을 맞춥니다.

Bean

Bean이란?

  • Bean은 스프링 컨테이너에 의해 관리되는 객체를 의미합니다. 주로 애플리케이션의 구성 요소로 사용됩니다.

Bean의 생명주기를 어떻게 관리하는가?

  • Bean의 생명주기는 스프링 컨테이너가 관리하며, 크게 초기화, 사용, 소멸 단계로 나뉩니다. @PostConstruct와 @PreDestroy 어노테이션을 사용하여 초기화와 소멸 시 특정 메서드를 실행할 수 있습니다.

Bean을 생성하려면 어떻게 해야 하는가?

  • XML 설정: <bean> 태그를 사용하여 Bean을 정의합니다.
  • 자바 설정: @Bean 어노테이션을 사용하여 메서드에서 Bean을 생성합니다.
  • 컴포넌트 스캔: @Component, @Service, @Repository, @Controller 어노테이션을 사용하여 자동으로 Bean을 등록합니다.

Bean Scope는 어떻게 지정하는가?

  • 스프링에서 Bean Scope는 @Scope 어노테이션을 사용하여 지정할 수 있으며, 주요 스코프는 다음과 같습니다:
    • Singleton: 기본 스코프로, 컨테이너당 하나의 인스턴스만 생성됩니다.
    • Prototype: 매번 새로운 인스턴스가 생성됩니다.
    • Request: HTTP 요청 당 하나의 인스턴스가 생성됩니다.
    • Session: HTTP 세션 당 하나의 인스턴스가 생성됩니다.

꼬리 질문:

  • Bean의 생명주기에서 어떤 단계가 가장 중요한가?
    Bean의 생명주기에서 가장 중요한 단계는 초기화 단계입니다. 이 단계에서 필요한 의존성을 주입하고, 초기 설정을 완료해야 Bean이 정상적으로 작동할 수 있습니다.
  • Prototype 스코프를 사용했을 때 주의할 점은 무엇인가?
    Prototype 스코프의 Bean은 스프링 컨테이너가 생명주기를 관리하지 않으므로, 개발자가 직접 메모리 관리를 해야 합니다. 특히, 소멸 메서드가 호출되지 않으므로 메모리 누수가 발생할 수 있습니다.

JPA

JPA와 ORM의 개념은?

  • JPA: 자바 애플리케이션에서 관계형 데이터베이스를 사용하기 위한 표준 API입니다.
  • ORM (Object-Relational Mapping): 객체와 관계형 데이터베이스 간의 매핑을 처리하는 방법입니다. JPA는 ORM의 구현체 중 하나입니다.

JPA에서 생명주기는 어떻게 관리되는가?

  • JPA 엔티티의 생명주기는 크게 네 가지 상태로 관리됩니다:
    • Transient: 영속성 컨텍스트에 관리되지 않는 상태입니다.
    • Persistent: 영속성 컨텍스트에 의해 관리되는 상태로, 데이터베이스와 동기화됩니다.
    • Detached: 영속성 컨텍스트에서 분리된 상태로, 데이터베이스와 더 이상 동기화되지 않습니다.
    • Removed: 삭제된 상태로, 데이터베이스에서 제거됩니다.

JPA에서 Entity를 설계할 때 발생했던 문제점과 해결 방법을 경험한 토대로 말해보세요

  • 문제점: 양방향 연관관계 설정 시, 순환 참조로 인한 StackOverflowError 발생.
  • 해결방법: 연관관계의 주인을 명확히 설정하고, @JsonIgnore 또는 @JsonBackReference를 사용하여 순환 참조를 방지했습니다.

N+1 문제 해결 방법은?

  • N+1 문제: JPA에서 연관된 엔티티를 조회할 때 발생하는 성능 저하 문제입니다. 첫 번째 쿼리로 N개의 엔티티를 조회한 후, 각 엔티티마다 추가적인 쿼리가 N번 실행되는 상황입니다.
  • 해결 방법:
    • @EntityGraph 또는 fetch join을 사용하여 한 번의 쿼리로 연관된 엔티티를 함께 조회합니다.

1차 캐시란?

  • JPA의 영속성 컨텍스트에 의해 관리되는 캐시로, 같은 트랜잭션 내에서 동일한 엔티티를 조회할 때 데이터베이스가 아닌 메모리에서 값을 가져옵니다.

Dirty Checking 방식 원리는?

  • JPA에서 엔티티의 상태 변경을 감지하여 트랜잭션이 종료될 때 자동으로 데이터베이스에 반영하는 방식입니다.

지연 로딩의 원리와 사용했을 때 장, 단점:

  • 원리: 실제로 객체를 사용할 때까지 데이터베이스 조회를 지연시키는 방식입니다. @ManyToOne 또는 @OneToMany 연관관계에서 지연 로딩을 설정할 수 있습니다.
  • 장점: 필요할 때만 데이터를 로드하여 성능 최적화가 가능합니다.
  • 단점: 예상치 못한 시점에 데이터베이스 조회가 발생하여 성능 저하가 생길 수 있습니다.

꼬리 질문:

  • 지연 로딩과 즉시 로딩의 차이점과 각각의 사용 시점은?
    지연 로딩(Lazy Loading)은 실제로 필요한 시점에 데이터를 로드하는 방식으로, 성능 최적화에 유리합니다. 즉시 로딩(Eager Loading)은 엔티티를 조회할 때 관련 데이터를 함께 로드하는 방식으로, 데이터의 일관성을 유지할 때 유용하지만, 필요하지 않은 데이터를 미리 로드하여 성능을 저하시킬 수 있습니다.
  • 1차 캐시가 성능에 미치는 영향은?
    1차 캐시는 동일한 트랜잭션 내에서 반복되는 데이터베이스 조회를 방지하여 성능을 개선할 수 있습니다. 하지만, 너무 많은 데이터를 캐시에 담으면 메모리 사용량이 증가할 수 있어, 적절한 캐시 전략이 필요합니다.
  • 양방향 연관관계에서 발생할 수 있는 문제점은?
    양방향 연관관계는 순환 참조로 인한 StackOverflowError를 유발할 수 있으며, 데이터베이스 업데이트 시 잘못된 데이터를 반영할 위험이 있습니다. 이를 해결하려면 연관관계의 주인을 명확히 설정하고, 순환 참조를 피하는 설계를 해야 합니다.

Spring Security

Security를 사용하는 이유는?

  • 애플리케이션의 보안을 강화하고, 인증과 인가를 통해 리소스 접근을 제어합니다.

Security에서 어떤 암호화 기술을 사용했고 그 이유는?

  • BCrypt: 해시 함수로 비밀번호를 암호화하며, salt를 추가하여 동일한 비밀번호도 다른 해시 값을 생성합니다. 이는 무차별 대입 공격(Brute Force Attack)을 방지하는 데 유용합니다.

인증과 인가는 어떻게 써야하는가?

  • 인증(Authentication): 사용자의 신원을 확인하는 과정입니다. 예를 들어, 사용자 로그인을 통해 신원을 확인합니다.
  • 인가(Authorization): 인증된 사용자가 특정 리소스에 접근할 수 있는 권한을 부여하는 과정입니다.

Security의 작동방식은?

  • Spring Security는 필터 체인을 통해 작동하며, 각 필터가 순차적으로 요청을 처리합니다. 인증 필터에서 사용자의 신원을 확인하고, 인가 필터에서 사용자의 권한을 검사합니다.

꼬리 질문:

  • Spring Security에서 OAuth2를 사용한 경험이 있는가?
    OAuth2를 사용해 소셜 로그인 기능을 구현한 경험이 있습니다. OAuth2는 외부 인증 제공자(예: Google, Facebook)와 연동하여 사용자의 인증을 처리할 수 있어 편리합니다.
  • Spring Security에서 커스텀 필터를 추가해본 경험이 있는가?
    커스텀 필터를 추가해 JWT 토큰 인증을 구현한 경험이 있습니다. 기본 제공 필터 외에 인증 방식을 커스터마이징하기 위해 커스텀 필터를 작성하여 필터 체인에 추가했습니다.
    • CSRF 보호를 비활성화 해야 하는 경우는 언제인가?
      CSRF 보호는 주로 상태 유지 애플리케이션에서 필요하지만, RESTful API처럼 상태를 유지하지 않는 애플리케이션에서는 불필요할 수 있습니다. 또한, 테스트 환경이나 클라이언트가 CSRF 토큰을 지원하지 않는 경우 비활성화할 수 있습니다.

JWT

왜 JWT를 사용했는가?

  • JWT는 세션 관리 방식보다 확장성이 뛰어나고, 클라이언트와 서버 간의 상태를 유지하지 않아 서버 부하가 줄어듭니다.

세션과 JWT를 비교했을 때 두 방식의 각각 장단점은?

  • 세션 기반 인증:
    • 장점: 보안이 상대적으로 강력하며, 세션 만료 등을 쉽게 관리할 수 있습니다.
    • 단점: 서버에 세션 데이터를 저장해야 하므로, 서버 부하가 증가합니다. 또한 서버 확장이 어렵습니다.
  • JWT 기반 인증:
    • 장점: 서버 확장성이 뛰어나고, 상태를 유지하지 않으므로 서버 부하가 줄어듭니다.
    • 단점: 토큰이 클라이언트에 저장되므로 만료 처리 및 보안 관리가 어렵습니다.

꼬리 질문:

  • JWT 사용 시 보안을 강화하기 위한 방법은?
    JWT 사용 시 보안을 강화하려면, 토큰에 민감한 정보를 포함하지 않고, HTTPS를 사용하여 전송하며, 서명 키를 안전하게 관리해야 합니다. 또한, 토큰 만료 시간을 짧게 설정하고, 리프레시 토큰을 사용해 세션 갱신을 처리하는 방법이 있습니다.
  • JWT를 리프레시 토큰과 함께 사용하는 이유는?
    액세스 토큰의 만료 시간을 짧게 설정하여 보안을 강화하고, 리프레시 토큰을 사용해 만료된 액세스 토큰을 갱신할 수 있습니다. 이는 사용자 경험을 개선하고, 액세스 토큰이 노출되더라도 리프레시 토큰을 통해 추가적인 보안을 제공합니다.

Exception 처리

프로젝트에서 예외처리를 어떻게 했는지 설명해보세요

  • 각 계층(Service, Controller)에서 발생할 수 있는 예외를 공통적으로 처리하기 위해 @ControllerAdvice를 사용했습니다. 또한, 특정 예외에 대해서는 커스텀 예외 클래스를 만들어 처리했습니다.

ExceptionHandler와 ControllerAdvice 어노테이션에 대해 설명해보세요

  • @ExceptionHandler: 특정 예외가 발생했을 때 실행될 메서드를 지정합니다. 해당 메서드는 예외를 처리하고, 적절한 응답을 반환할 수 있습니다.
  • @ControllerAdvice: 전역적으로 예외를 처리하기 위한 어노테이션으로, 모든 컨트롤러에 적용되는 예외 처리 로직을 작성할 수 있습니다.

꼬리 질문:

  • 전역 예외 처리를 사용했을 때의 장점과 단점은?
  • 커스텀 예외를 정의할 때 어떤 점을 고려해야 하는가?

OAuth2

OAuth2를 사용해본 경험이 있나요?

네, OAuth2를 사용해본 경험이 있습니다. 주로 사용자 인증 및 권한 부여를 위한 서비스에 OAuth2를 적용했습니다. 소셜 로그인(예: Google, Facebook 로그인)과 API 보호를 위해 사용했으며, 이를 통해 사용자가 별도의 계정 없이도 쉽게 애플리케이션에 로그인할 수 있도록 구현했습니다.

OAuth2를 어떤 방식으로 구현하셨나요?

OAuth2는 주로 Authorization Code Grant 방식을 사용하여 구현했습니다. 이 방식은 보안이 중요한 서버 측 애플리케이션에 적합합니다. 기본적으로 다음과 같은 흐름으로 구현했습니다:

  1. 사용자가 로그인 요청을 하면, 클라이언트는 OAuth2 제공자(Google, Facebook 등)의 인증 페이지로 리다이렉션합니다.
  2. 사용자가 인증을 완료하면, OAuth2 제공자는 Authorization Code를 클라이언트에게 전달합니다.
  3. 클라이언트는 이 Authorization Code를 사용하여 액세스 토큰을 요청합니다.
  4. 서버는 이 토큰을 통해 사용자 정보를 받아오거나, API 호출 시 인증 수단으로 사용합니다.
  5. OAuth2를 사용하면 어떤 장점이 있나요?

OAuth2를 사용하면 다음과 같은 장점이 있습니다:

  1. 보안 강화: OAuth2는 토큰 기반 인증을 사용하여, 민감한 사용자 자격 증명(예: 비밀번호)을 직접 주고받지 않습니다. 이는 보안 리스크를 줄이는 데 도움이 됩니다.
  2. 확장성: OAuth2는 다양한 클라이언트(모바일 앱, 웹 앱 등)에서 통합할 수 있으며, 여러 서비스 제공자(Google, Facebook 등)와의 인증을 쉽게 연동할 수 있습니다.
  3. 유연성: OAuth2는 다양한 인증 플로우를 지원하여, 웹 애플리케이션, 모바일 앱, 서버 간 통신 등 다양한 환경에 맞게 적용할 수 있습니다.
  4. 사용자 경험 개선: 사용자 입장에서는 여러 서비스에 별도의 계정 없이 쉽게 로그인할 수 있어 사용자 경험이 향상됩니다.
  5. 사용자의 인증 과정에 대해 설명할 수 있나요?

OAuth2의 인증 과정은 다음과 같습니다:

  1. 클라이언트 애플리케이션이 사용자를 OAuth2 제공자의 로그인 페이지로 리다이렉션합니다.
  2. 사용자가 OAuth2 제공자에게 로그인 및 권한 부여를 완료하면, OAuth2 제공자는 클라이언트에 Authorization Code를 전달합니다.
  3. 클라이언트는 이 코드를 사용해 서버 측에서 액세스 토큰을 요청합니다.
  4. 서버는 액세스 토큰을 발급하고, 클라이언트는 이 토큰을 사용하여 보호된 리소스(API)에 접근합니다.
  5. 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 요청합니다.
  6. Bearer 인증 방식은 어떤 방식인가요?

Bearer 인증 방식은 액세스 토큰을 사용하여 인증을 수행하는 방식입니다. 클라이언트는 보호된 리소스에 접근할 때 HTTP 요청 헤더에 Authorization: Bearer {토큰} 형식으로 액세스 토큰을 포함시켜 요청을 보냅니다. 서버는 이 토큰을 검증하여 유효한 요청인지 판단하고, 권한이 있는 경우 리소스에 접근을 허용합니다.

Bearer 인증은 OAuth2에서 널리 사용되며, 토큰이 탈취될 경우 누구나 이 토큰으로 보호된 리소스에 접근할 수 있으므로, 반드시 HTTPS를 통해 통신을 암호화해야 합니다.

OAuth2를 사용해본 경험이 있나요?

꼬리 질문:

  • OAuth2를 사용해 인증을 구현할 때, 어떤 문제에 직면했었나요? 이를 어떻게 해결했나요?
  • OAuth2 구현 시 클라이언트 ID와 클라이언트 시크릿을 어떻게 관리했나요?
  • OAuth2를 사용할 때 보안을 강화하기 위해 어떤 조치를 취했나요?

답변:

  • OAuth2를 사용해 인증을 구현할 때, 어떤 문제에 직면했었나요? 이를 어떻게 해결했나요?: OAuth2를 구현할 때, 리다이렉션 URI의 일관성 문제가 발생했습니다. 이는 클라이언트 측의 URL 관리와 서버 측의 리다이렉션 설정을 정확하게 맞추는 방식으로 해결했습니다. 또한, 토큰 유효성 검사와 리프레시 토큰 처리에서 발생하는 문제는 추가적인 토큰 검증 로직을 구현하여 해결했습니다.
  • OAuth2 구현 시 클라이언트 ID와 클라이언트 시크릿을 어떻게 관리했나요?: 클라이언트 ID와 클라이언트 시크릿은 환경 변수나 암호화된 설정 파일에 저장하여 보안을 강화했습니다. 이러한 민감한 정보는 코드베이스에 직접 포함시키지 않도록 주의했습니다.
  • OAuth2를 사용할 때 보안을 강화하기 위해 어떤 조치를 취했나요?: HTTPS를 통해 모든 통신을 암호화하고, 토큰의 유효성을 주기적으로 확인하며, 짧은 액세스 토큰 만료 시간과 리프레시 토큰을 사용하는 방식으로 보안을 강화했습니다. 또한, 권한 스코프를 설정하여 각 API 엔드포인트에 대한 접근 권한을 제한했습니다.

OAuth2를 어떤 방식으로 구현하셨나요?

꼬리 질문:

  • OAuth2를 구현할 때 어떤 인증 방식을 사용했나요? (Authorization Code, Implicit, Resource Owner Password, Client Credentials)
  • OAuth2의 리프레시 토큰을 사용하여 토큰 갱신을 구현했나요? 그렇다면 어떻게 했나요?
  • OAuth2를 통해 인증된 사용자의 정보를 어떻게 처리했나요?

답변:

  • OAuth2를 구현할 때 어떤 인증 방식을 사용했나요?: 주로 Authorization Code 방식을 사용했습니다. 이 방식은 서버 측에서 클라이언트가 아닌, 권한 서버에서 직접 액세스 토큰을 발급받기 때문에 보안이 강화됩니다. 특히, 민감한 정보를 클라이언트에 노출하지 않기 위해 이 방식을 선호했습니다.
  • OAuth2의 리프레시 토큰을 사용하여 토큰 갱신을 구현했나요? 그렇다면 어떻게 했나요?: 네, 리프레시 토큰을 사용하여 액세스 토큰이 만료될 때 새로운 토큰을 발급받도록 구현했습니다. 클라이언트가 만료된 액세스 토큰과 함께 리프레시 토큰을 서버에 보내면, 서버는 리프레시 토큰의 유효성을 검증한 후 새로운 액세스 토큰을 발급합니다.
  • OAuth2를 통해 인증된 사용자의 정보를 어떻게 처리했나요?: 인증이 성공한 후, OAuth2 공급자로부터 사용자 정보를 받아 사용자 계정을 생성하거나, 기존 계정과 연동했습니다. 이때, 사용자 정보는 JWT 또는 사용자 세션에 저장하여 이후 요청 시 참조할 수 있도록 했습니다.

OAuth2를 사용하면 어떤 장점이 있나요?

꼬리 질문:

  • OAuth2를 사용할 때 어떤 단점이나 한계가 있나요?
  • OAuth2를 다른 인증 방식과 비교해본다면, 어떤 점이 더 유리한가요?
  • OAuth2를 사용할 때 보안적인 리스크는 무엇이 있을까요?

답변:

  • OAuth2를 사용할 때 어떤 단점이나 한계가 있나요?: OAuth2의 단점 중 하나는 구현 복잡성입니다. 특히, 다양한 인증 흐름과 토큰 관리 방식으로 인해 개발과 설정이 복잡해질 수 있습니다. 또한, 토큰을 안전하게 관리하지 않으면 보안에 취약할 수 있습니다.
  • OAuth2를 다른 인증 방식과 비교해본다면, 어떤 점이 더 유리한가요?: OAuth2는 다른 인증 방식에 비해 보안성과 유연성이 뛰어납니다. 예를 들어, API와 클라이언트 간에 민감한 정보를 주고받지 않고, 토큰 기반으로 접근 권한을 제어할 수 있어 보안이 강화됩니다. 또한, OAuth2는 소셜 로그인과 같은 외부 인증 제공자와 쉽게 통합할 수 있어 사용자 경험을 개선할 수 있습니다.
  • OAuth2를 사용할 때 보안적인 리스크는 무엇이 있을까요?: OAuth2에서 가장 큰 보안 리스크는 토큰 탈취입니다. 액세스 토큰이 탈취되면 공격자가 해당 토큰을 사용하여 API에 접근할 수 있습니다. 이를 방지하기 위해 HTTPS 사용, 토큰 만료 시간 짧게 설정, 리프레시 토큰 사용 등이 필요합니다.

사용자의 인증 과정에 대해 설명할 수 있나요?

꼬리 질문:

  • OAuth2 인증 과정에서 Authorization Code가 중요한 이유는 무엇인가요?
  • Access Token과 Refresh Token의 차이점은 무엇인가요?
  • 인증 후에 서버에서 Access Token을 검증하는 방법은 무엇인가요?

답변:

  • OAuth2 인증 과정에서 Authorization Code가 중요한 이유는 무엇인가요?: Authorization Code는 클라이언트가 아닌 서버 측에서 액세스 토큰을 발급받는 데 사용되므로, 민감한 정보가 클라이언트에 노출되지 않아 보안이 강화됩니다. 이는 OAuth2의 기본적인 보안 메커니즘으로, 클라이언트가 Authorization Code를 얻은 후 서버에 전달하여 액세스 토큰을 안전하게 발급받습니다.
  • Access Token과 Refresh Token의 차이점은 무엇인가요?: Access Token은 사용자가 API에 접근할 때 사용하는 단기 유효 토큰이며, 보통 짧은 만료 시간을 가집니다. 반면, Refresh Token은 Access Token이 만료된 후 새로운 Access Token을 발급받기 위해 사용되며, 더 긴 만료 시간을 가집니다. Access Token은 주로 API 호출 시 사용되고, Refresh Token은 보안을 위해 서버에서만 사용됩니다.
  • 인증 후에 서버에서 Access Token을 검증하는 방법은 무엇인가요?: 서버는 Access Token을 검증할 때, 토큰의 서명(Signature)을 확인하여 변조 여부를 판단합니다. 또한, 토큰의 발급자(Issuer)와 만료 시간(Expiration Time)을 확인하여 유효한 토큰인지 검증합니다. 이를 통해 유효하지 않은 토큰을 차단하고, 사용자에게 접근 권한을 부여합니다.

Bearer 토큰의 보안적 약점은 무엇인가요?

  • Bearer 토큰은 탈취당할 경우, 별도의 인증 과정 없이 해당 토큰을 소유한 자가 API에 접근할 수 있는 문제가 있습니다. 이는 HTTPS를 사용하지 않거나, 토큰이 클라이언트 측에서 노출되는 경우 발생할 수 있는 보안 리스크입니다.

Bearer 인증과 기본 인증(Basic Auth)의 차이점은 무엇인가요?

  • Bearer 인증은 액세스 토큰을 사용하여 API에 접근하는 방식으로, 토큰을 서버에서 발급받아 사용합니다. 반면, 기본 인증은 사용자의 사용자명과 비밀번호를 Base64로 인코딩하여 서버에 보내는 방식으로, 보안 측면에서 덜 안전합니다. Bearer 인증은 주로 OAuth2에서 사용되며, Basic Auth는 간단한 인증 시나리오에서 사용됩니다.

Bearer 토큰을 안전하게 관리하기 위한 방법은 무엇인가요?

  • Bearer 토큰을 안전하게 관리하려면 HTTPS를 사용하여 토큰을 전송하고, 클라이언트 측에서는 토큰을 안전하게 저장해야 합니다. 또한, 토큰의 만료 시간을 짧게 설정하고, 리프레시 토큰을 사용해 정기적으로 갱신하는 것이 중요합니다. 토큰이 유출된 경우, 서버에서 해당 토큰을 즉시 무효화하는 방법도 필요합니다.
728x90
반응형
SMALL

'면접 준비' 카테고리의 다른 글

면접 준비시 반드시 피해야 할 것들!  (2) 2024.11.12
백엔드 자바 CS 면접 빈출 질문 대비하기 - 데이터 베이스 개념 정리 1  (0) 2024.08.22
백엔드 자바 CS 면접 빈출 질문 대비하기 - 자바 초급+중급  (0) 2024.08.13
백엔드 자바 CS 면접 빈출 질문 대비하기 - Security  (0) 2024.08.01
백엔드 자바 면접 빈출 질문 대비하기 - 리스트 업  (0) 2024.08.01
  1. 자바(초급+중급) 면접 리스트 보러가기 https://sunro1994.tistory.com/240
  2. Dispatcher Servlet
  3. IoC / DI
  4. AOP
  5. Bean
  6. JPA
  7. Spring Security
  8. JWT
  9. Exception 처리
  10. OAuth2
  11. OAuth2를 사용해본 경험이 있나요?
  12. OAuth2를 어떤 방식으로 구현하셨나요?
  13. OAuth2를 사용하면 어떤 장점이 있나요?
  14. 사용자의 인증 과정에 대해 설명할 수 있나요?
'면접 준비' 카테고리의 다른 글
  • 면접 준비시 반드시 피해야 할 것들!
  • 백엔드 자바 CS 면접 빈출 질문 대비하기 - 데이터 베이스 개념 정리 1
  • 백엔드 자바 CS 면접 빈출 질문 대비하기 - 자바 초급+중급
  • 백엔드 자바 CS 면접 빈출 질문 대비하기 - Security
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
IT - railroadIT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Spring Data Redis
      자바 면접질문
      redis 채팅
      CSS
      자바
      HTML
      자바 알고리즘
      JSP
      자바스크립트
      자바 반복문
      JS
      리눅스
      백준
      java
      자바 면접
      Til
      Springframework
      프로그래머스
      리눅스마스터2급
      리눅스마스터2급정리
      springsecurity
      자바기초
      jsp기초
      Spring
      jsp request
      레디스
      스프링프레임워크
      JavaScript
      spring redis
      redis
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    백엔드 자바 CS 면접 빈출 질문 대비하기 - 스프링

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.