인증과 인가_Network

miin·2022년 1월 10일
0

Network

목록 보기
9/13
post-thumbnail

인증 (Authentication)

  • 유저가 누구인지 확인하는 절차이다
  • 회원가입, 로그인등 사용된다
  • 인증과 인가는 API에서 가장 자주 구현되는 기능 가운데 하나이다.
  • Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구한다.

인가 (Authorization)

  • 유저에 대한 권한을 허락하는 것
  • 게시판에서 다른 사람이 쓴 글을 나는 수정할 수 없다.

인증과 인가의 방법

  1. 인증하기 -> Request Header
  2. 인증 유지하기 -> Brower
  3. 안전하게 인증하기 -> Server
  4. 효율적으로 인증하기 -> Token
  5. 다른 채널을 통해 인증하기 -> OAuth

Request Header

http://<ID>:<Pssword>@www.myservice.com/login
1. 위와 같이 request header에 ID와 Password값을 넣어 전달한다.
2. 약속된 방법(Base64 encoding)으로 암호화 된 문자열로 서버는 받아들인다.
3. 서버는 이를 해석하고 DB에서 일치하는 User 정보를 찾는다.
4. 있다면 인증 OK

  • 단점: 매번 인증해야 한다

Browser(Client를 통한 인증과 인가의 방식)

  • 매번 인증하는 과정을 피하기 위해 브라우저의 스토리지를 이용
  • 로컬 스토리지, 세션 스토리지, 쿠키 등으로 ID, Password를 저장
  • 인증된 상태를 유지
  • 단점 : 사용자에게 편한만큼, 해커에게도 해킹하기 편하다.

Session(Server를 통한 인증과 인가의 방식)

  1. 사용자가 요청을 보낸다.
  2. 서버는 이를 해석해서 DB에 일치하는 유저가 있는지 확인한다.
  3. 서버는 인증된 사용자의 식별자와 랜덤의 문자열로 세션 ID를 만든다
  4. 사용자에게 세션 ID를 전달한다
  5. 사용자는 세션 ID를 저장해서 이용한다.

장점

  • 크게 위험하지 않다.
  • 세션의 만료기간을 정할 수 있어서 기간이 지나면 해커가 가져가도 위험하지 않다.
  • 서버에서 탈취된 세션을 삭제하면 해당ID를 이용할 수 없다

단점

  • 여러개의 서버를 두었을때 문제가 생긴다.
  • client가 한 서버에 요청을 해서 session ID를 전달 받았는데, 이후 다른 서버에 요청을 하면 그 서버에는 session ID가 없기 때문에 연결이 되지 않는다.
    -> 해결방안
    따로 세션 DB를 두는 방식이 있다. 하지만 이 또한 client가 많아졌을 때 DB가 터질 수도 있다.

Token

client와 server한테도 맡겼으니 이번에는 요청과 응답안에 사용자의 상태를 담아보자!! -> token

JWT(Jason Web Token)
  • secret key를 사용해서 JWT를 만들어낸다.
  • secret key를 통해 JWT의 인증 과정을 거친다.
  • JWT자체는 해독하기가 매우 쉽다. 그래서 비밀번호와 같은 민감한 정보는 담지 않는다. 그리고 secret key가 중요한 만큼 노출이 되면 안된다. 그래서 서버 내부에서 잘 관리를 해야한다.

방법

  1. 사용자가 요청을 보낸다.
  2. 서버는 이를 해석해서 DB에 일치하는 유저가 있는지 확인한다.
  3. 서버는 secret key를 사용해서 JWT를 만들어낸다.
  4. JWT를 응답 헤더에 담아 클라이언트에게 전달한다.
  5. 클라이언트는 이 토큰을 저장한다.
  6. 클라이언트는 다음부터 요청을 보낼 때 헤더에 토큰을 담아 보낸다.
  7. 각 서버는 본인이 가진 secret key로 이 토큰의 유효성 검사를 한다.
  • 사용자 정보 확인 : 이름, 만료시기, 권한
  • 단점: 유효기간이 지나면 사용자는 계속 Access Token을 요청해야 한다.
    (해결 방안은 Refresh Token)

0개의 댓글