스프링 숙련주차 돌입
Bean에 대해배웠다. 정리해보자.
같은 속성의 Bean이 2개이상일때 어떻게 관리해야 하는가?
인터페이스 Food를 구현하고 있는 Chicken 클래스와 Pizza 클래가 있다. 이때 Chicekn Pizza를 둘 다 @Component로 등록하여 관리하고 싶을 때 Food 객체를 @Autowired 어노테이션을 사용하여 관리할 때 Chicken의 빈으로 등록할지, Pizza의 빈으로 등록할지 결정을 해주어야 한다 이때 등장하는 것이 @Primary어노테이션과 @Qualifier("~")이다.
@Primary 어노테이션은 Food 인터페이스 @Autowired를 통해 관리할때 가장 우선순위가 높게 등록이 된다.
@Qualifier("~")은 ~에 해당할 때 해당 클래스를 Bean으로 등록해준다. 이때 @Qualifier("~")는 클래스에도 등록이 되어야 하고, Bean으로 등록할 때도 사용되어야 한다. 이때 우선순위는 @Qualifier("~")가 없다면 @Primary가 빈으로 등록된다.
사용방식은 만약 내가 식당을 운영하는데 치킨이 훨씬 많은 주문을 가지고 있다면 Chicken 클래스에 @Primary어노테이션을 달아두면 편하게 사용할 수 있겠다.
인증과 인가란 무엇인가?
인증이란 사용자가 해당 사용자인지 확인하는 것. 예를들어 로그인 하는 사용자가 우리 회원인지 확인하는 것이 인증
인가란 사용자가 어디까지 접근할 수 있는지 권한에 대한 얘기.
비연결성 이란 클라이언트와 서버는 한번의 요청과 응답 후에 연결이 끊어지고, 새로운 요청이 들어오기 전까진 연결이 끊긴 상태로 있다. 그리고 서버는 기존의 상태를 모두 초기화 한 상태로 있다. 그렇다면 우리는 기존의 상태(예를들어 로그인한 상태)를 어떻게 관리해야할까?
1. 쿠키-세션 방식
로그인 된 상태를 직접 저장하는 것이 아니라 로그인 된 상태를 session ID에 담아서 관리 하는 방법.
위의 그림처럼 세션 저장소를 가지고 있는 것이 특징이며, 로그인이 된 후에는 쿠키에 로그인 된 상태를 담아 서버에 요청을 하고 쿠키 검증은 세션 저장소에서 검증을 하게 된다.
쿠키란 세션과 함께 상태를 저장하기 위해 사용된다. 쿠키에는 상태를 담을 수 있는 작은 정보 파일이다.
세션이란 일정시간 동안 클라이언트의 상태를 저장하기 위해 사용된다. 서버에서는 클라이언트 별로 유일한 세션 id를 발급해 관리하고 클라이언트 별 필용한 정보를 저장한다. 서버에서 생성한 세션 id는 클라이언트에 쿠키값으로 저장되어 클라이언트 실별에 사용된다.
쿠키와 세션의 작동 방식은 다음과 같다.
1. 클라이언트가 서버에 1번 요청.
2. 서버가 세션id를 생성 후 쿠키에 정보를 클라이언트에 응답
3. 클라이언트가 쿠키에 세션id를 저장(세션쿠키)
4. 클라이언트가 서버에 2번 요청(쿠키값(세션id를 포함) 포함하여 요청)
5. 서버가 세션id를 읽고 1번 요청임을 한 클라이언트 임을 인지
이렇게 세션이 요청에 맞게 쿠키를 발급하고, 클라이언트는 쿠키속 세션 id를 통해 서버에 재요청, 서버는 요청받은 쿠키속 세션 id를 통해 재응답하는 구조이다.
2. JWT 기반 인증
JWT 기반의 인증의 특징은 세션 저장소가 필요 없다는 것. 로그인이 된 후에 JWT를 발급하고, 서버에서 JWT 토큰을 이용해 검증을 하는 방식이다.
JWT란 JSON포멧을 이용해 사용자의 속성을 저장하는 Claim 기반의 Web Token 방식. 일반적으로 쿠키저장소를 이용하여 JWT를 저장한다. JWT를 사용하는 이유는 클라이언트당 서버를 1개를 사용 하는 것이 아니라 여러개의 서버를 사용 하기 때문이다. 이때 문제가 되는 것은 서버에 있는 세션마다 각각 다른 클라이언트의 정보를 갖게 되면 문제가 되기 때문.
이런식으로 세션과 클라이언트가 구성이 된다고 가정 해보자. 클라이언트1의 정보를 Session1이 가지고 있을때, 해당 정보가 Session2에 전송이 된다면 인증이 허가되지 않게 된다. 따라서 사용자는 인증에 실패하게 된다.
이런 문제점을 해결하기 위해서 첫번째로 각각의 클라이언트마다 세션을 고정시켜서 사용하는방법. 두번째는 세션 저장소를 따로 두어 세션 저장소에서 인증을 하게 하는 방법이 있다.
이떄 JWT는 두 방법이 아닌 , 로그인 정보를 서버에 저장하지 않고, 클라이언트에 JWT로 암호화하여 저장해서 준다.
그리고 응답받은 JWT는 Security key로 검증을 한다. 이때 모든 서버의 Security key는 동일하게 가져간다.
JWT의 사용 흐름을 알아보자.
1. 클라이언트가 로그인에 성공시 -> 서버에서 로그인 정보를 JWT로 암호화 -> 서버에서 쿠키를 생성해 JWT를 담아 클라이언트에 전달 -> 브라우저 쿠키 저장소에 자동으로 JWT 저장
2. 클라이언트에서 JWT 인증 방법 : 서버에서 API 요청시 마다 JWT를 이용해 인증
이러한 방식으로 작동된다.
오늘 배웠던 JWT 방식을 통해 회원가입과 로그인을 할 수 있는 웹페이지를 구현해보고자 한다. 지난 입문 주차에서는 이론적으론 잘 이해했다 생각했는데 막상 코드에 대입하려니 막막했던 기억이 있었다. 이번에는 이론과 실습을 동시에 진행하면서 공부해야겠다.