Spring 숙련 1주차 (1)

신성훈·2024년 5월 24일

TIL

목록 보기
24/162
post-thumbnail

오늘의 학습 키워드

  • Bean
  • 인증과 인가
  • 쿠기와 세션

Bean

  • 프로젝트 생성 후 설정추가 작업을 해야한다.

    -build.gradle

    // Security
    implementation 'org.springframework.boot:spring-boot-starter-security'
  • Bean 자동 등록
    -@Component 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.
    -@Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하는게 좋다.
  • Bean 수동 등록 방법
    -Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정
    -Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정
    -Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장 된다.
    -'Bean' 이름: @Bean 이 설정된 메서드명
    public PasswordEncoder passwordEncoder() {..} → passwordEncoder
  • 같은 타입의 Bean 등록
    -@Autowired를 사용하여 Bean 객체를 주입
    -@Autowired가 기본적으로는 Bean Type(Food)으로 DI를 지원하며 연결이 되지않을 경우 Bean Name(객체, 객체)으로 찾는 다는 것을 알 수 있다.
    @Autowired
    Food 객체1;
    @Autowired
    Food 객체2;
    -@Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입한다.
    -같은 타입의 Bean들에 @Qualifier와 @Primary가 동시에 적용되어있다면 @Qualifier의 우선순위가 더 높다.
    -같은 타입의 Bean이 여러 개 있을 때
    • 범용적으로 사용되는 Bean 객체에는 Primary를 설정한다.
    • 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.

인증과 인가

  • 인증 (Authentication) : 해당 유저가 실제 유저인지 인증하는 개념
    -ex. 스마트폰 지문인식, 사이트 로그인

  • 인가 (Authorization) : 는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념
    -ex. 관리자페이지-관리자 권한자만 접속

  • 웹 애플리케이션 인증
    -Http 라는 프로토콜을 이용하여 통신
    -통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어 진다.

  • 인증방식
    -쿠키-세션방식의 인증
    ->서버가 ‘특정 유저가 로그인 되었다’는 상태를 저장하는 방식

    -JWT 기반 인증
    ->JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미
    ->JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별

쿠키와 세션

  • 쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful)하기 위해 사용
    -> 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

  • 쿠키
    -클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
    -구성요소

    • Name (이름): 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
    • Value (값): 쿠키의 값
    • Domain (도메인): 쿠키가 저장된 도메인
    • Path (경로): 쿠키가 사용되는 경로
    • Expires (만료기한): 쿠키의 만료기한 (만료기한 지나면 삭제된다.)

  • 세션
    -서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
    -서버에서 클라이언트 별로 유일무이한 '세션 ID' 를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
    -서버에서 생성한 '세션 ID' 는 클라이언트의 쿠키값('세션 쿠키' 라고 부름)으로 저장되어 클라이언트 식별에 사용
    -세션 동작 방식

  • 쿠키와 세션 비교

  • 쿠키 다루기

  1. 쿠키 생성
  • new Cookie(AUTHORIZATION_HEADER, cookieValue);
    -> Cookie에 저장될 Name과 Value를 생성자로 받는 Cookie 객체를 생성
  • setPath("/") , setMaxAge(30 * 60)
    -> Path와 만료시간을 지정
  • HttpServletResponse 객체에 생성한 Cookie 객체를 추가하여 브라우저로 반환
    -> 반환된 Cookie는 브라우저의 Cookie 저장소에 저장
  • Cookie 생성은 범용적으로 사용될 수 있기 때문에 static 메서드로 선언
  1. 쿠기 읽기
    @GetMapping("/get-cookie")
    public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
    System.out.println("value = " + value);
    return "getCookie : " + value;
    }
  • @CookieValue("Cookie의 Name")
    -> Cookie의 Name 정보를 전달해주면 해당 정보를 토대로 Cookie의 Value를 가져온다.

  • 세션 다루기
    -Servlet에서는 유일무이한 '세션 ID'를 간편하게 만들수 있는 HttpSession을 제공 해준다.
  1. HttpSession 생성
    @GetMapping("/create-session")
    public String createSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 새로운 세션을 생성한 후 반환
    HttpSession session = req.getSession(true);
    // 세션에 저장될 정보 Name - Value 를 추가합니다.
    session.setAttribute(AUTHORIZATION_HEADER, "Auth");
    return "createSession";
    }
  • HttpServletRequest를 사용하여 세션을 생성 및 반환할 수 있다.
  • req.getSession(true)
    -> 세션이 존재할 경우 세션을 반환하고 없을 경우 새로운 세션을 생성
  • 세션에 저장할 정보를 Name-Value 형식으로 추가
  • 반환된 세션은 브라우저 Cookie 저장소에 ‘JSESSIONID’라는 Name으로 Value에 저장
  1. HttpSession 읽기
    @GetMapping("/get-session")
    public String getSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 null 반환
    HttpSession session = req.getSession(false);
    String value = (String) session.getAttribute(AUTHORIZATION_HEADER); 
    // 가져온 세션에 저장된 Value 를 Name 을 사용하여 가져옵니다.
    System.out.println("value = " + value);
    return "getSession : " + value;
    }
    -req.getSession(false) ->세션이 존재할 경우 세션을 반환하고 없을 경우 null을 반환
    -session.getAttribute(”세션에 저장된 정보 Name”)
    ->Name을 사용하여 세션에 저장된 Value를 가져온다.

📝오늘의 회고

숙련주차 차근차근 가보자~
오늘도! 쳐지지 말고 포기하지말고 힘내서 가보자고~

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글