인증(Authentication)과 인가(Authorization)

최준혁·2021년 5월 7일
1

Spring

목록 보기
3/5

@Reference

인증(Authentication)?

: 유저가 누구인지 확인하는 과정
ex) 회원가입, 로그인

인가(Authorization)?

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

실생활 예시

일상생활에서 일어나는 경우가 컴퓨터 세계 속에서 비슷하게 일어나는 경우가 많다. 인증과 인가가 그러한 부분이다. 만약 내가 다니는 회사가 어떠한 건물에 8층에 위치한다고 해보자. 건물 출입구에는 내가 이 건물에 출입 가능한 사람인지 인증의 과정을 거친다. 이후 나는 엘레베이터를 타고 8층으로 가 일을 하러 갈 것이다. 하지만 내가 11층에 있는 다른 회사에 출입할 수 있을까? 그것은 불가능하다. 그러할 권한이 없기 때문이다. 여기서 적용되는 개념이 인가이다. 즉 권환을 확인하는 과정이다. 한편 이 예시에서 알 수 있듯이 인증인가에 선행되는 개념이다.

인증과 인가의 방법

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

이 중 OAuth는 따로 게시물로 다루기로 하겠다!

1. Request Header

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

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

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

  • 매번 인증하는 과정을 피하기 위해 브라우저의 스토리지를 이용
  • 로컬 스토리지, 세션 스토리지, 쿠키 등으로 ID, Password를 저장
  • 인증된 상태를 유지

단점 : 사용자에게 편한만큼, 해커에게도 해킹하기 편하다.

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

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

장점

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

단점

여러개의 서버를 두었을 때 문제가 생긴다. client가 한 서버에 요청을 해서 session ID를 전달 받았는데, 이후 다른 서버에 요청을 하면 그 서버에는 session ID가 없기 때문에 연결이 되지 않는다.

해결방안

이를 해결하기 위해 따로 세션 DB를 두는 방식이 있다. 하지만 이 또한 client가 많아졌을 때 DB가 터질 수도 있다.

4. 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)

profile
개발과 일상을 공유

0개의 댓글