Week01 회고

Isabel·2022년 3월 13일
0

첫번째 주차에서는 로그인, 로그아웃 기능을 배웠다.
여기서 사용된 인증 방식을 포함하는 여러 인증 방식들과 프로그램과 프로그램을 연결하는 API에 대해 더 자세히 다뤄보고자 한다.

인증 방식

인증방식에는 3가지가 있다.

  1. 계정정보를 요청 header에 넣는 방식
  2. Session / Cookie 방식
  3. 토큰 기반 인증 방식(JWT)

1. 계정정보를 요청 header에 넣는 방식

가장 보안이 낮은 방식으로 HTTP요청에 인증할 수단에 비밀번호를 넣는 방식이다. 데이터를 요청할 때마다 사용자의 비밀번호 정보를 반복적으로 보내기 때문에 보안에는 아주 취약하다.
위 방식으로는 인증 테스트를 할 때 빠르게 try를 해볼 수 있다는 장점이 있지만 보안에 매우 취약하기 때문에 사용되지 않는다.

  • Cookie: 쿠키는 클라이언트 로컬에 저장되는 key와 value가 들어있는 작은 데이터 파일이다. 사용자 인증 유효기간을 정할 수 있으며, 브라우저가 종료되어도 유효기간동안의 인증은 유지된다.

  • Session: 쿠키를 기반으로 한다. 하지만, 쿠키와 달리 사용자 정보 파일을 서버 측에서 관리한다. 서버에서는 클라이언트를 구분하기 위해 세션 ID를 발급하여 웹 브라우저가 서버에 접속하여 브라우저를 종료할 때까지 인증을 유지한다.


사용자가 로그인을 하면 서버에서는 회원DB에서 회원인지 확인한다.
→회원이 맞다면 사용자에게 고유한 ID값을 부여하여 session 저장소에 저장한 후 이에 맞는 session ID를 발행한다.
→사용자는 서버에서 해당 session ID를 받아 cookie에 저장한 후 , 인증이 필요할 때마다 cookie를 header에 담아 보낸다.
→그러면 서버에서는 받은 cookie와 session 저장소에 대조되는 cookie가 있는지 확인하고, 확인된다면 데이터를 전달해주는 방식으로 진행된다.


  • session/cookie 방식은 cookie를 매개로 인증을 진행한다. cookie가 담긴 HTTP요청이 노출되더라도 cookie는 보안상 중요한 정보를 담고 있지는 않기 때문에 헤더에 계정정보를 직접 넣어 전달하는 방식보다는 보안이 좋다.

  • 또한, 각 사용자가 고유한 ID값을 부여받기 때문에 서버에서는 일일이 회원정보를 확인할 필요 없이 어떤 회원인지를 바로 확인할 수 있어 서버에 접근이 용이하다.

  • session/ cookie 인증방식은 기본적으로 세션 저장소를 필요로 하기 때문에 서버에 추가적인 저장공간을 많이 필요로 할 수 있다.

  • session hijacking 공격 가능하다: 해커가 사용자의 HTTP 요청을 가로챈다면 이 때 cookie도 훔칠 수가 있다. 이 훔친 cookie를 사용하여 해커가 HTTP에 요청을 몰래 보내면 원래 사용자로 인식하고 정보를 불러올 수 있다.

3. JWT (JSON Web Token) 토큰 기반 방식

JSON 객체를 사용하여 정보를 안정성있게 전달하는 웹 표준으로 로그인 기능을 구현할 때 JWT를 사용한다. JWT는 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다. 놀이공원에서의 자유이용권 팔찌와 같은 것이된다고 생각하면 더 쉽게 이해가 가능하다. 로그인을 하고 다른 기능이나 페이지에 접근할 때 자유이용권 티켓(JWT)을 보여주면 신분을 확인하여 시설을 자유롭게 이용할 수 있게 해준다.


사용자는 JWT Access Token을 HTTP 헤더에 실어 서버로 전달한다.
JWT에서는 Token 안에 유저의 정보를 넣는다.

Token을 만들기 위해서는 아래의 3가지가 필요하다.

  • Header: 토큰을 만들기 위해서 필요한 정보를 암호화할 방식alg, 타입type 등이 들어간다.
  • Payload: 서버에서 보내는 데이터가 들어간다. User 고유 ID값, 유효기간exp 등이 들어간다.
  • Verify Signature: Header, payload를 합친 문자열을 서명한 값이 들어간다. Header에 정의된 알고리즘alg과 secret key를 이용하여 서명을 생성하고 Base64방식으로 인코딩한다.

Encoded Header + "." + Encoded Payload + "." + Verify Signature


사용자가 로그인을 하면 서버에서 계정정보를 읽고 회원인지 확인한 후, 사용자의 고유한 ID값을 부여하고, 기타 정보와 함께 Payload에 넣는다.
→ JWT의 유효기간exp를 설정한다.
→ secret key를 이용하여 Access Token을 발급한다.
→ 사용자는 이 토큰을 받아 저장한 후, 인증이 필요할 때마다 토큰을 Header에 담아 보낸다.
→ 서버에서는 해당 토큰의 verify signature을 secret key로 복호화한 후, 조작여부, 유효기간 exp를 확인한다.
→ 검증 후 Payload를 디코딩하여 ID값에 맞는 데이터를 가져온다.


  • 별도의 저장소가 없기 때문에 관리가 필요치 않기 때문에 유지, 보수하는 데 강점이 있다.

  • 확장성이 좋다. 토큰 기반 인증 시스템은 다른 인증 시스템에 접근이 용이하다. 여기에 선택적으로 이름이나 이메일을 받을 수 있는 권한도 받을 수 있다.
    예시로 Facebook 로그인, Google 로그인 등이 있다.

  • JWT는 한 번 발급되면 유효기간 동안에는 계속 사용이 가능하고 중간에 토큰을 지워 사용을 막는 등의 제한을 둘 수가 없다.
    (-> 제안되는 해결 방안: Access Token의 유효기간을 줄이고, Refresh Token이라는 새로운 토큰을 발급하여 상대적으로 피해를 줄일 수 있다. )

  • Payload 정보가 제한적이다. Payload는 따로 암호화되지 않기 때문에 디코딩하면 누구든지 접근할 수가 있기 때문에 보안이 중요한 정보들은 Payload에 넣지 않는다.

  • JWT는 길이가 길기 때문에 인증이 필요한 요청이 많을수록 서버에서 자원 낭비가 발생할 수 있다.


API

처음 미니 웹 프로젝트 S.A.를 작성할 때 아래와 같이 개발해야하는 기능들을 정리해 오라고 했다.

그래서 저 표를 보고 API는 기능 목록인가 라고 생각했다.
API에 대해서 찾아 보았으나 설명은 아래와 같았다.
프로그램들이 서로 상호작용하는 것을 도와주는 매개체

네?

내가 생각한 API는 서버와 클라이언트, 데이터베이스 등 프로그램들이 서로 데이터를 주고받는 방법, 데이터를 주고받는 통로(url), 받아오는 정보 등을 정리한 것, 어떤 방식으로 명령이나 요청을 내리면 어떤 기능을 수행하도록 정리해 놓은 것으로 클라이언트와 서버, 사용자가 웹 서비스를 이용할 때 해준다고 생각을 하였다.


내가 공부한 API의 기능은 아래와 같다.

API의 기능

  • API는 서버와 데이터베이스에 대한 창구 역할을 한다
    API는 서버와 데이터베이스에 대한 창구로서의 역할을 하며, 허용된 사람들에게만 접근성을 부여한다.

  • 애플리케이션(프로그램)과 기기가 원활하게 통신할 수 있도록 한다
    API는 프로그램과 기기가 데이터를 원활히 주고받을 수 있도록 돕는 역할을 한다.

  • API는 모든 접속을 표준화한다
    API는 모든 접속을 표준화하기 때문에 기계/ 운영체제 등과 상관없이 누구나 동일한 액세스를 얻을 수 있다.


나는 첫번째 프로젝트를 수행할 때 아래와 같이 API를 구성하였다.

이 때 몇몇 Method나 response가 잘못되어 수정을 했지만 (ex. 댓글 삭제의 Method를 DELETE로 수정) 팀원들간에 구현해야하는 기능을 공유할 수 있었다.
또한 위 프로젝트에서는 기능별로 작업을 수행하여 Front, Back 구분이 없이 작업을 진행했지만, 부분을 달리하여 팀으로 프로젝트를 진행할 때는 이 API를 기반으로 커뮤니케이션을 하며 데이터를 주고 받겠고, 이 API를 이해하는 게 코딩을 할 때 아주 중요하겠다는 생각을 하였다.


첫 주가 끝이 났다.
MUMA 미니 프로젝트가 끝났지만 뭔가 만족스럽지가 않다. 필터링을 잘 구현한 줄 알았지만 여러번 시행하면 에러가 발생하였고 나는 이번 주차의 주요 강의 내용인 회원가입과 로그인 로그아웃 기능 구현을 주도적으로 진행하지 않았기 때문에 뭔가 더 깊게 공부하지 못한 기분이 들었다. 이처럼 아쉬웠던 부분은 차차 공부를 진행하면서 처음 진행했던 프로젝트에 기능을 하나씩 부여하면서 더욱 프로젝트를 더욱 완성도 있게 해내하고자 한다.


이렇게 하다보면 나도 3개월 뒤에는 똑순이가 되겠지?? ㅎㅎ

이 다음 글에서는 jinja2라던지 회원가입 기능 구현에 대해 더 다뤄보도록 하겠다.
알고리즘 주차도 화이팅!!

0개의 댓글