https://sunro1994.tistory.com/230
백엔드 자바 면접 빈출 질문 대비하기 - 리스트 업
어느날 한 취업준비를 하기 위해 여러 영상들을 보고 어떤 질문들을 주로 준비해야 하는지 하나씩 리스트로 추출하고 있었다. 리스트를 만들어본 결과 내가 가장 대답하기 곤란하고 생각지도
sunro1994.tistory.com
이전에 적었던 질문들에 대한 답변을 적어보도록 하겠습니다.
추가적으로 중요한 개념들도 추가하여 적고 있습니다.
아래 내용에서 추가되었으면 좋겠다! 싶은 내용들은 댓글에 리뷰와 함께 적어주세요 :)
[Security]
1. 왜 Security를 사용했는가?
- 핵심 키워드 : 인증, 권한 관리, 데이터 보호 기능
- 의도 : 웹 개발 과정에서 자바 개발자들이 보안 기능을 추가할 때 필요한 기능을 제공하기 때문에 개발 작업 효율을 높일 수 있다.
- Security 특징 :
! Spring 생태계 내에서 구현해야 하는 회원가입, 로그인, 로그아웃, 세션 관리, 권한 관리등의 사용자 관리 부분에 대한 보안 관련 기능들이 Spring프레임워크 안에서 활용하기 적합한 구조로 설계되어 있다.
! 스프링에서 추구하는 IoC/DI 패턴과 같은 확장 패턴을 염두해서 인증/ 인가 부분을 구현할 때 SpringSecurity에서 이와 같은 기능을 제공해준다.
2. Spring Security 아키텍처에 대해 알고있는가?
아래와 같은 그림은 Security를 사용하셨다면 머리속에 이미 그려져 있어야 하는 그림입니다.
- 핵심 키워드 :
UsernamePasswordAuthenticationToken, AuthenticationManager. AuthenticationProvider, AuthenticationProvider
- 진행 순서 :
- 사용자가 로그인 정보와 함께 인증 요청을 합니다.
- AuthenticationFilter가 요청을 가로채서 UsernamePasswordAuthenticationToken의 인증용 객체를 생성합니다.
- AuthenticationManager의 구현체인 ProviderManager에게 생성한 UsernamePasswordToken 객체를 전달합니다.
- AuthenticationManager는 등록된 AuthenticationProvider들을 조회하여 인증을 요구합니다.
- 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨줍니다.
- 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만듭니다.
- AuthenticationProvider들은 UserDetails를 넘겨받고 사용자 정보를 비교합니다.
- 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환합니다.
- 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환됩니다.
- Authentication 객체를 SecurityContext에 저장합니다.
- SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장합니다.
3. 인증과 인가를 구분할 수 있는가?
- 키워드 : 인증,인가를 영어로 말했을때 헷갈리지 말것
- 인증(Authentication) : 해당 사용자가 본인이 맞는지 확인합니다.
- 인가(Authorization) : 인증된 사용자가 요청한 자원에 접근 가능한지를 결정합니다.
spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인합니다. Spring Security는 위 플로우에서 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용합니다.
- Principal(접근 주체) : 보호받는 Resource에 접근하는 대상입니다.
- Credential(비밀번호) : Resource에 접근하는 대상의 비밀번호입니다.
3. 왜 Security를 사용하고 Session statement를 stateless로 사용했는가?
4. security 에서 csrf를 disable로 한 이유
- 키워드 : csrf
- 의도 : csrf의 의미를 알고 왜 사용하지 않는지 말하는 것이 중요
- 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 갖고 타인의 인증된 정보를 악용하는 것이다.
- GET요청을 제외한 상태를 변화시킬 수 있는 POST, PUT, DELETE 요청으로부터 보호한다.
- html에서 다음과 같은 csrf 토큰이 포함되어야 요청을 받아들이게 된다.
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
- REST API에서의 CSRF
rest api는 session을 사용하여 지속적으로 통신이 이어져 있는 상태가 아닌 Stateless 상태를 적용하기 때문에 서버에 별도의 세션 정보를 보관하지 않는다.
REST API에서 clients들은 JWT토큰 또는 OAuth2를 사용하여 인증을 요청한다.
따라서 CSRF 관련 적용을 할 필요가 없는것이다.
5. CORS설정을 하는 이유
- 키워드 : CORS(Cross Origin Resource Sharing), SOP(Same Origin Policy), Preflight Request
- 의도 : SOP 문제를 해결하기 위함, SOP가 무엇이고 CORS를 어떻게 설정하는지 알아야 한다.
- Origin 구성 요소
아래 3가지 요소중 하나라도 다르면 SOP 정책에 위배된다.
1. URI 스키마(protocol)
2. 호스트명Host)
3. 포트(80, 8080등)
- 동작 원리(SimpleRequest)
1. 클라이언트가 어떠한 자원을 요청할 때 http 프로토콜을 사용하여 요청을 보내게 된다. 이때 브라우저는 요청 헤더에 Origin 필드를 담아 보낸다.
2. 서버의 응답이 왔을 때 브라우저가 요청한 origin과 응답한 헤더의 Access-Control-Allow-Origin의 값을 비교해 유효한 요청이면 응답한다.
2-1. 이때 Content-Type(application/x-www-form-urlencoded, multipart/form-data, text/plain)중 하나이다.
3. 허용되지 않은 Origin이라면 CORS 정책 위반 이슈가 발생한다. 이때 Code Status는 200번이다.
- Preflight Request
1. Origin헤더에 현재 요청하는 origin과 Access-Control-Request-Method 헤더에 요청하는 Http Method와 Access-Control-Request-Headers 요청시 사용할 헤더를 OPTIONS 메서드로 서버에 요청한다.
2. 다른 내용없이 헤더만을 전송
3. 브라우저가 서버에서 응답한 헤더를 보고 유효한 요청인지 확인하고 만약 유효하지 않은 요청이라면 에러가 발생한다.
4. 유효한 요청이라면 요청을 다시 하여 자원에 대한 응답을 받는다.
6. Security를 사용했을때 발생한 문제점과 해결방법
- 키워드 : 예외 처리, @RestControllerAdvice, @ExceptionHandler
- 의도 : 발생할 수 있는 예외 처리를 어떻게 처리하였는지, 어떤 어노테이션을 사용했고 어떻게 작동하는지 알고 있는가
- RestControllerAdvice
아래 문서를 보면 내용은 다음과 같다. @RestControllerAdvice는 @ControllerAdvice와 @ResponseBody를 합친 어노테이션이다. @ControllerAdvice의 역할을 수행하고, @ResponseBOdy를 통해 객체를 리턴할 수 있다.
단순히 예외처리를 하고 싶다면 @ControllerAdvice를, 응답으로 객체를 리턴해야 한다면 @RestControllerAdvice를 적용할 수 있다.
- 문서
A convenience annotation that is itself annotated with @ControllerAdvice and @ResponseBody. Types that carry this annotation are treated as controller advice where @ExceptionHandler methods assume @ResponseBody semantics by default.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
- ExceptionHandler
메서드에 선언해서 특정 예외 클래스를 지정해주면 해당 예외가 발생했을 떄 정의한 로직으로 처리할 수 있다.
@ControllerAdvice 또는 @RestControolerAdvice에 정의된 메서드가 아닌 일반 컨트롤러단의 메서드에 선언할 경우, 해당 Controller에만 적용된다.
@Service 등의 빈에서는 적용되지 않는다.
레퍼런스
https://velog.io/@sun1203/CORS%EB%9E%80
'면접 준비' 카테고리의 다른 글
백엔드 자바 CS 면접 빈출 질문 대비하기 - 스프링 (1) | 2024.08.14 |
---|---|
백엔드 자바 CS 면접 빈출 질문 대비하기 - 자바 초급+중급 (0) | 2024.08.13 |
백엔드 자바 면접 빈출 질문 대비하기 - 리스트 업 (0) | 2024.08.01 |
[CS면접 및 자바 면접 준비] DB 데이터 베이스 면접 정리 - DB의 기 (0) | 2024.03.28 |
[CS면접 및 자바 면접 준비] Generic 및 쓰레드 면접 질문 정리 (0) | 2024.03.27 |