-
3-3, 3-4 인증과 인가 / 쿠키와 세션스파르타 강의 정리 2023. 11. 7. 20:34
인증과 인가란 무엇일까?
아이디 카드가 있으면 너는 어디까지 갈 수 있니?
인증
Authentication- 로그인 할 때 아이디카드 수준을 판단. 처음 한번만 실행
- 해당 유저가 실제 유저인지 인증하는 개념
ex. 폰 지문인식, 사이트 로그인 등인가
Authorization- 아이디카드를 통해 접근권한을 인가
- 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인*HTTP 통신은 비연결성과 무상태로 이루어져 있다.
비연결성
Connectionless- 서버와 클라이언트가 연결되어 있지 않음
- 서버의 리소스 절약을 위해
- 사실상 하나의 요청에 하나의 응답을 보낸 후 연결을 끊고 있다고 생각하면 된다.무상태
Stateless- 서버가 클라이언트의 상태를 저장하지 않음
- 이 또한 서버 비용 부담을 덜기 위해.
- 서버는 기존의 상태가 없다고 가정하는 프로토콜을 이용해 구현되어 있음
- 그래서 서버는 클라이언트가 직전에, 혹은 그 전에 어떠한 요청을 보넀는지 관심도 없고
전혀 알지 못함그럼 어떻게 비연결성, 무관심 프로토콜에서 유저 인증정보를 유지하는가?
쿠키세션방식
서버가 특정 유저가 로그인이 되었다는 상태를 저장하는 방식 중 하나
인증과 관련된 약간의 정보만 서버가 가지고 있으면서 로그인을 유지한다.
서버에서는 로그인 요청을 받고 DB에 해당 정보가 있는 경우
세션저장소에 정보를 넣는다.
세션저장소는 session-id라는 난수를 발급하고, 서버는 로그인 요청 응답에
session-id를 담아 클라이언트에게 보낸다.
클라이언트는 그 session-id를 쿠키 저장소에 보관하고 이후의 요청마다 session-id를 같이 보낸다.(HTTP 헤더에 주로 담아서 보냄)
서버가 클라이언트의 요청에서 쿠키를 찾으면
세션저장소가 자신이 가진 정보와 쿠키를 비교검증하고
유저정보가 제대로 들어있다면 로그인 된 사용자로 인증하고
로그인 된 유저에 따른 응답을 보낸다.JWT 기반 인증
JWT (Json Web Token) 란 인증에 필요한 정보들을 암호화시킨 토큰
쿠키세션방식처럼 JWT토큰 (Access Token) 을 HTTP 헤더에 담은 것을 통해 서버가 클라이언트를 식별
DB를 통한 사용자 확인까지는 같다.
이후 정보가 일치한다면 인증을 통과한 것으로 보고
유저정보를 JWT로 암호화해서 로그인 요청 응답에 같이 보낸다.
클라이언트는 그 토큰을 저장소(쿠키저장소나 로컬스토리지)에 보관한 후
이후의 요청마다 토큰을 같이 보냄서버는 요청에서 토큰을 발견했다면 그 토큰을 검증하여,
인증완료시 로그인된 유저에 따른 응답을 보낸다
두 방식의 차이
쿠키세션방식은 생성한 세션을 저장해둬야한다. 이후 비교검증에 사용되므로
하지만 JWT는 토큰을 저장할 필요없이 검증만 하면 된다.
그래서 JWT가 더 효율적이며 서버에 부담도 덜하다.
쿠키와 세션이란 무엇일까
쿠키와 세션 모두 http에 상태정보를 유지(Stateful) 하기 위해 사용된다.
-> 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.
쿠키 - 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
세션 - 서버에서 일정시간 동안 클라이언트 상태를 유지 하기 위해 사용됨
- 서버에서 클라이언트 별로 유일무이한 세션id를 부여한 후 클라이언트 별로 필요한 정보를 서버에 저장
- 서버에서 생성한 세션id는 클라이언트의 쿠키값(세션쿠키라고 부름) 으로 저장되어 클라이언트 식별에 사용됨
URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");
쿠키에서 "가 나다" 이런식으로 공백이 존재하면 저장이 불가능하다.
그래서 위 코드를 사용하여 인코딩을 한번 해줘야한다.
try문 안에서 제일 위에 저 코드를 쓴 후 기존코드를 아래에 쓰면 된다.
인텔리제이 코드 매개변수에 있는 HttpServletResponse 여기에 담으면 클라이언트로 자연스럽게 반환된다.
쿠키를 가져오는 법은
@CookieValue(여기에 쿠키네임을 넣으면 된다. 예제코드에서는 "Authorization" 이므로 이걸 담은 변수
AUTHORIZATION_HEADER을 넣었음)세션 만드는법
HttpServletRequest - 서블릿에서 요청 들어왔을때 리퀘스트객체도 만들어준다.
그것을 파라미터에 선언하면 받아올 수 있다. 쿠키에서 리스폰스 받아온것과 같다.
다른부분도 쿠키와 같이 동작한다.HttpSession session = req.getSession(false);
true라면 세션이 존재하면 세션반환, 존재하지 않으면 새 세션을 생성 후 반환인데
이처럼 false라면 없을경우 null을 반환한다.
그래서 세션을 생성(create)할때는 true를 넣고, 가져올때(get)는 false를 넣어서 사용한다.'스파르타 강의 정리' 카테고리의 다른 글
회원가입 구현 및 Filter (0) 2023.11.08 3-5, 3-6 JWT (0) 2023.11.07 3-1, 3-2 Bean 수동등록, 같은 타입의 Bean이 여러개 라면? (0) 2023.11.07 [1주차] 새로배운 것들 정리 (1) (0) 2023.11.01 [0주차] 1~3강 (0) 2023.10.30