ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 헤더에 담은 것을 통해 서버가 클라이언트를 식별

    JWT

     

    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를 넣어서 사용한다.  

Designed by Tistory.