ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [항해 99 주특기] 인증 / 인가 (쿠키 && 세션)
    개발일지/항해 99 2023. 7. 12. 21:40

    인증 / 인가

    인증이란 서비스를 이용하려는 유저가 등록된 회원인지를 확인하는 절차

    인가란 특정 리소스에 접근할 권한이 유저에게 있는지 확인하는 절차

     

    클라이언트가 서버에게 인증을 요청을 하고 서버는 클라이언트에게 인가를 해주는 것이 기본개념

     

    http프로토콜 통신의 특징

     

    무상태

    서버와 클라이언트 사이에 상태가 없다는 뜻

    클라이언트가 서버에 요청을 하고 응답을 받는 사이클이 한번 지나고 나면 서버는 클라이언트에 상태에 대해서 어떠한 정보도 가지고 있지 않는다 (기억하지 않는다.)

    이후 클라이언트가 새로운 요청을 보내면 서버는 항상 새롭게 생각하며 응답한다.

    서버는 클라이언트의 상태를 별도로 기억할 필요가 없이 요청대로 항상 응답한다.

    이러한 특성은 동일한 서버를 여러개로 확장시킬 수 있다(scale-out) 는 점이 있어 무상태의 특성이 http 프로토콜 통신의 특징 중 하나이다 .

     

    비연결성

    연결되어있는것을 생각하고 반대로 생각해라

    채팅어플의 경우는 계속 연결되어있는 상태인 것이기에 연결성이 있다고 표현을 하지만 http는 비연결성을 가지기에 항상 연결되는 것이 아님 항상연결되어있다고 좋은것은 아니지만 상황에 따라 다름

    사용자요청이 잦다면 비연결성이 비효율적이지만 그밖에는 효율적이다

     


     

    쿠키

     

    HTTP프로토콜이 가진 무상태와 비연결성 2가지의 특징에도 불구하고 서버가 클라이언트를 기억하게끔 보이게 만드는 것이다.

    무상태와 비연결성인 HTTP프로토콜의 특징을 조금 개선할 수 있는 방향으로 쓰인다

    쿠키의 모양은 브라우저에 저장되는 text파일이고 key value pair 형태이다.

    별도로 삭제처리를 하거나 유효기간이 만료되지 않는 이상 자동으로 주고받기때문에 서버가 클라이언트의 인증상태를 기억하는 것처럼 구현된다.

     

    클라이언트가 서버에게 특정 API를 요청했을 때 서버는 응답시에 header 안에 set-cookie속성을 쿠키정보를 담아주고 브라우저는 이를 자동으로 저장한다. 그리고 서버에 요청을 할때 클라이언트는 쿠키를 자동이로 서버에게 보낸다. 이러한 것이무상태와 비연결성의 특징을 가진 HTTP 프로토콜이 마치 기억하고 있는 것처럼 만들어준다

     

    origin이란 출처를 의미하는데 전체 url 중에서 프로토콜 호스트or 도메인 포탈을 포함한 부분이 origin이다

    이게 뭔 내용이지?(단 동일한 origin CORS를 허용하는 origin에만 쿠키를 보낸다)

    CORS란 무엇일까

    cross origin resource sharing 다른 출처에 리소스 요청하는 것을 허용하는 원칙  오리진 간에 리소스를 쉐어링하는 정책

    브라우저는 기본적으로 보안때문에 같은 오리진에만 자원을 공유하는 것을 원칙으로 가지고있다

    서버와 클라이언트는 각각 CORS설정을 통해 서로 의견이 맞는다면 다른 출처도 API요청을 할 수 있게 해준다.

    쿠키는 클라이언트에서 직접 추가 수정 삭제가 가능하다. 그렇기에 보안이 매우매우 취약하다 

     


     

    세션

     

    클라이언트와 서버간의 연결이 활성화 된 상태를 의미하는 개념이다.

    HTTP 프로토콜의 비연결성을 기본적으로 가지고 있기에  연결을 활성해준다는 것이 어색함이 있지만 세션을 통해서 연결을 유지하는 것이 가능하게하는것이 세션이다. 

    로그인이 성공되었을 때 서버에서 세션을 생성하고 저장한다 이것을 쿠키로써 브라우저에게 전달을 해주면 세션키를 브라우저가 가지고 있다면 계속해서 요청을 할때마다 브라우저에 있는 키를 서버에 자동으로 요청을 하고 이러면 계속연결이 되어있는것처럼 느낄 수있다. 

     

    GET요청시에 쿠키를 보내듯 세션아이디를 자동으로 헤더에 넣어서 서버에 보낸다. 그러면 세션스토리지에서 세션아이디가 있는지 확인을 해서 있다면 데이터베이스에 클라이언트에서 요청한 작업을 수행한 뒤 응답값을 준다

     

    post요청시에 3번쨰 옵션이 꼭 필요한 이유 (CORS 때문에)

    클라이언트는 3000번 서버는 4000번 포트를 사용하기에 각각 분리가 된 다른 서버이다.

    그래서 withCredential을 true로 해야지만 다른 서버간의 정보교환이 가능해지는 것이다

    false로 되었을 시에는 받아 온 쿠키를 자동으로 저장을 해야하지만 저장하지 않는다 다른서버간의 정보교환이 허용되지 않기 때문이다

    서버든 클라이언트든 이게 false로 되어있으면 안된다 서버에 false가 되어있다면 cors오류가 바로 난다. 아예 통신이 되지 않는다.

     

    꿀팁

    f12에서 어플리케이션에서 쿠키정보를 볼 수 있었음 그리고 네트워크에서 확인 할 수 있는 것이 있음

     

    댓글

Designed by Tistory.