Bean이란?, 인증과 인가란?(쿠키, 세션) +게시판 프로젝트 마무리

김재현·2023년 11월 10일
0

TIL

목록 보기
27/88
post-thumbnail
  • 프로젝트명: "게시판 만들기"
  • 프로젝트 소개: 게시글을 쓰거나 지울 수 있는 게시판 프로그램입니다.
  • 사용 기술: #SpringBoot #JPA #MySQL
    GitHub: https://github.com/k-jaehyun/Board

Bean 다루기

Bean을 수동으로 등록하는 방법

  • Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정합니다.
  • Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정합니다.
  • Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장됩니다.

같은 타입의 bean이 2개라면?

Food 인터페이스에 Chicken, Pizza 구현 클래스를 만들어서 @Component로 둘 다 Bean 주입 가능.

"Food 타입의 bean 객체가 1개보다 많다." -> 치킨, 피자 2개 있기 때문에 어느것을 주입시킬지 물어보는 것이다.
Food food; --> 이렇게하면 Food타입의 food라는 bean을 찾아봤는데 없음 -> spring은 구현체의 bean 을 찾음(chiken,pizza) -> 2개 중에 하나를 골라야 하므로 오류.

해결방법1: bean 이름을 직접 주입.

	@Autowired
    Food pizza;  //--> bean으로 등록된 이름을 직접 명시해줌.

    @Autowired
    Food chicken;

해결방법2: bean에 우선순위 적용 -> 해당 bean 위에 @Primary

해결방법3: @Qualifier로 직접 가져온다 -> @Qulifier("bean이름")을 해당 bean에 써주고, @Autowired 밑에도 똑같이 써줌.

Primary와 Qualifier 가 동시에 걸려있으면 Qualifier의 우선순위가 더 높음.
--> 범용적 사용에는 Primary를 걸어두고, 지엽적 사용에는 Qualifier를 직접 붙여주고 사용하면 됨

(보통 Spring에서는 좁은 범위의 설정이 더 우선순위가 높다!)


인증과 인가

인증과 인가란 무엇일까?

- 인증(Authentication)

인증은 해당 유저가 실제 유저인지 인증하는 개념

- 인가(Authorization)

인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념

Http 라는 프로토콜을 이용하여 통신하는데, 그 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어짐.

  • 비연결성(Connectionless)은 서버와 클라이언트가 연결되어 있지 않다는 것
  • 무상태(Stateless)는 서버가 클라이언트의 상태를 저장하지 않는다는 것

인증 처리 방식

(서버는 비연결성, 무상태를 갖는데도 불구하고 인증이 되었다는 사실을 어떻게 인지하고 있을 것인가!)

1. 쿠키-세션 방식의 인증

  • 서버가 ‘특정 유저가 로그인 되었다’는 상태를 저장하는 방식.
  • 인증과 관련된 최소한의 정보는 저장해서 로그인을 유지시킨다는 개념!
    session ID: 난수 -> 유저 정보와 관련 없음(보안상의 이유)
    사용자는 session ID를 쿠키라는 저장소에 보관하다가, 요청을 할 때 같이 보낸다.

2. JWT 기반 인증

  • JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미.
  • JWT 토큰(Access Token)을 HTTP 헤더(바디에도 가능)에 실어 서버가 클라이언트를 식별
    서버가 자체적으로 JWT라는 암호화된 토큰을 발급하는 것임.
    사용자가 받은 토큰은 일반적으로 쿠키에 저장됨.

쿠키-세션 방식은 세션 저장소가 따로 있고, 거기서 검증을 진행하기 때문에 서버의 부담을 줄일 수 있다.

쿠키와 세션이란 무엇일까?

쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful)하기 위해 사용.
(=클라이언트별 인증 및 인가를 위해)

1. 쿠키

클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일.
크롬 F12에서 Application - Storage - Cookies 에 도메인 별로 저장되어 있는게 확인됨.
(번외) local storage, session storage에 대해서도 학습하면 도움이 많이 됨.

쿠키 예시

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

2. 세션

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

- 세션 동작 방식

1. 클라이언트가 서버에 1번 요청
2. 서버가 세션ID 를 생성하고, 쿠키에 담아 응답 헤더에 전달
3. 클라이언트가 쿠키에 세션 ID를 저장
4. 2번 요청(쿠키값에 세션 ID 포함하여 요청)
5. 서버가 세션 ID를 확인하고 1번 요청과 같은 클라이언트임을 인지
--> 세션ID 를 사용하여 세션을 유지!!


어제 포스팅했던 게시판 만들기에 대한 해설 강의를 보며 공부해보았다.

함께 추가적으로 공부한 것은 다음과같다.

  • 엔터티는 setter 사용을 지양하며, DTO는 상관 없다는 사실
  • 왜 엔터티에는 setter를 사용하지 말아야하는지
  • hibernate의 ddl-auto 속성의 종류와 주의해야할 점
  • 서블릿 -> 요청을 담는 3가지 기술(DTO, HttpServletRequest, 매개변수)
  • @GeneratedValue의 GenerationType

GenerationType을 IDENTITY로 했을 때 오류가 났었는데, 고쳤다!
포스팅 하고싶으나 내용이 너무 많아서...
정리해둔 원노트를 첨부한다.
>원노트 링크


관련 포스팅

Previous Post

profile
I live in Seoul, Korea, Handsome

0개의 댓글