[CS] 인증과 인가

그냥·2022년 6월 14일
0

cs

목록 보기
2/6

인증(Authentication)

인증은 유저의 identification(신원)을 확인하는 절차이다(유저의 아이디와 비밀번호 등을 확인하는 절차)


1. 로그인 절차

1) User ID와 PW 생성.
2) User PW를 암호화 하여 DB에 저장.
3) User 로그인 시 ID와 PW 입력.
4) User가 입력한 PW 암호화 한후 DB에 저장된 User PW와 비교.
5) 일치하면 로그인 성공.
6) 로그인 성공하면 access token을 client에게 전송.
7) User는 로그인 성공 후 부터는 access token을 첨부해서 request를 서버에 전송하여 매번 로그인 하지 않아도 됨.

2. User Password 암호화

1) User의 PW는 절대 PW 그대로 DB에 저장하지 않는다.
- DB가 해킹을 당하면 PW도 그대로 노출된다.
- 외부 해킹이 아니더라도 내부 개발자나 인력이 User의 PW를 볼 수 있다.
2) User의 PW는 꼭 암호화해서 저장해야 한다.
- 그럼으로 DB가 해킹을 당해도 PW가 그대로 노출되지 않으며 내부 인력도 PW를 알 수가 없음.
3) PW 암호화에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰임.
- 단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지인 digest를 생성한다.
- 원본 메시지를 알면 암호환된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성이라고 한다.

3. Bcrypt

1) 단방향 해쉬 함수의 취약점
- Rainbow table: 미리 해쉬값을 계산해 놓은 테이블
- 해시 함수는 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것이다. 그렇기 때문에 해시 함수는 본래 처리 속도가 최대한 빠르도록 설계되었다. 이러한 속성 때문에 공격자는 Rainbow table을 바탕으로 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다. 

2) 단방향 해쉬 함수 보완 방법
- Salting: 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법
- Key Stretching: 단방향 해쉬값을 계산한 후 그 해쉬값을 계속 해쉬 반복하는 방법

3) bcrypt
- Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수 이다.

4. JWT(JSON Web Tokens)

앞서 언급했듯이 유저가 로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.

  • 유저 로그인:
POST /auth HTTP/1.1 
Host: localhost:5000
Content-Type: application/json

{
    "username": "joe",
    "password": "pass"
}
  • access token:
HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}
  • 그러면 서버에서 acess token을 복호화해서 유저 정보를 얻게된다.
  • 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알 수 있다.
  • access token을 생성하는 방법은 여러가지이다. 그 중 가장 널리 사용하는 기술이 JWT(JSON Web Token)이다.
  • JWT는 User 정보를 담은 JSON 데이터를 암호화해서 client와 server 간에 주고 받는 것이다.



인가(Authorization)


1. 인가

1) 인가는 user가 request를 실행할 수 있는 권한이 있는 user인가를 확인하는 절차이다.
- 예를 들어, 해당 user는 고객 정보를 볼 수 있지만 수정할 수 없다.
2) 인가도 JWT를 통해서 구현할 수 있다.
- access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인할 수 있다.

2. 인가 절차

1) 인가 절차를 통해 access token을 생성한다. access token에는 user 정보를 확인할 수 있는 정보가 들어가 있어야 한다.(ex. user id)
2) user가 request를 보낼 때 access token을 첨부해서 보낸다.
3) server에서는 user가 보낸 access token을 복호화한다.
4) 복호화된 데이터를 통해 user id를 얻는다.
5) user id를 사용해서 DB에서 해당 user의 권한을 확인한다.
6) user가 충분한 권한을 가지고 있으면 해당 요청을 처리한다.
7) user가 권한을 가지고 있지 않다면 Unauthorized Response(401)혹은 다른 에러 코드를 보낸다.

0개의 댓글