본문 바로가기

TIL

[2022-1-24] HTTP, 스프링 웹 MVC공부, 패스워드의 암호화 개념

HTTP 상태코드

1XX - 요청이 수신되어 처리중 - 잘 사용하지 않음

 

2XX

- 클라이언트의 요청을 성공적으로 처리

 

200 OK - 요청 성공

 

201 Created : 요청에 성공해서 새로운 리소스가 생성됨

- 요청에 의해 생성된 리소스는 응답 메세지 헤더의 Location 속성으로 식별할 수 있다.

 

202 Accepted : 요청이 접수되었으나 처리가 완료되지 않음

 

204 No Content : 서버가 요청을 성공적으로 요청을 수행했지만, 응답 페이로드에 보낼 데이터가 없음

- 문서의 저장버튼 처럼 같은 화면을유지하는 것과 같이 응답 데이터가 필요하지 않을 때 사용한다.

 

200,201 만 사용하는 경우가 많음

 

3XX

- 요청을 완료하기 위해 웹브라우저의 추가적인 조치가 필요

-  웹 브라우저는 3XX 응답결과에 Location 헤더가 있을 경우 그 Location으로 자동 이동(Redirect)

 

리다이렉션의 종류

영구 리다이렉션 : 특정 리소스의 URI로 영구히 이동 

일시 리다이렉션 : 일시적인 변경 - 주문 완료 후 주문 내역으로 이동

특수 리다이렉션(캐시) : 결과 대신 캐시 사용.

 

영구 리다이렉션 코드 : 301 Moved Permanently,308 Permanent Redirect

- 리소스의 URI 가 영구적으로 이동, 원래의 URI 사용X, 검색 엔진에서도 변경 인지

- 301 : POST 요청일 때, 리다이렉트를 요청 시 요청이 GET으로 바뀌고 본문 제거될 수 있음

- 308 : POST 요청일 때, 리다이렉트를 요청 시 POST 방식 유지, 본문도 그대로 전달(잘 사용하지 않음, 보통 보내야하는 본문이 바뀜)

 

일시 리다이렉션 코드 : 302 Found, 307 Temporary Redirect, 303 See Other

- 리소스의 URI가 일시적으로 변경

- 302 : POST 요청일 때, 리다이렉트를 요청 시 요청이 GET으로 바뀌고 본문 제거될 수 있음

- 307 : 리다이렉트시 본문 유지, 요청 메서드 변경X

- 303 : 302와 기능이 같고 요청이 GET 방식으로 무조건 변경

 

PRG (Post/Redirect/Get)

POST 요청이 진행 중일 때 새로고침을 하면 POST 요청이 다시 한번 들어갈 수 있다. POST 요청이 중복되면 의도와 다르게 두번 리소스를 생성하는 위험성이 생긴다. 이 때 302 또는 303 응답 코드를 사용하고 헤더의 Location 에 Post 요청으로 생성된 리소스의 식별 URI를 전달해 주면 브라우저는 해당 URI로 Redirect 되어 요청 데이터를 조회하는 Get 요청을 보내게 된다. 때문에 POST 요청은 기존에 의도한대로 한번만 수행되는 것이다.

 

많은 웹어플리케이션 라이브러리에서 기본값으로 302를 사용하고 있다.

 

기타 리다이렉션 코드 : 300 Multiple Choices, 304 Not Modified

- 300 : 사용하지 않음

- 304 : 클라이언트에게 리소스가 변경되지 않았으니 로컬PC 에 저장된 캐시를 사용할 것을 명시(캐시로 리다이렉트), 로컬캐시를 써야하므로 바디 사용X

 

4XX

- 클라이언트 요청의 오류, 오류의 원인이 클라이언트에 있음

- 같은 요청을 여러번 해도 계속 실패

 

- 400 Bad Request : 요청 구문, 메세지 작성 오류, ex)요청 파라미터 잘못, API스펙이 맞지 않을 때

- 401 Unauthorized : 클라이언트가 해당 리소스에 대한 인증이 필요함, WWW-Authenticate 헤더와 함께 인증 방법을 설명해야함

- 403 Forbidden : 서버가 요청을 이해했지만 권한이 없음, ex) 사용자 계정이 관리자 계정 리소스로 접근하려고 할 경우

- 404 Not Found : 해당 리소스,페이지가 서버에 없음, 403과 상황이 같지만 권한이 없다는 것조차 드러내고싶지 않을 때

 

5XX

- 서버 오류

- 서버 재가동시 해결될 수도 있음

 

- 500 Internal Server Error : 서버 내부 문제로 오류 발생

- 503 Service Unavailable : 일시적인 과부하나 예정된 작업으로 잠시 요청 처리 불가

 

 

패스워드 암호화

 

2월달에 진행할 로그인/회원가입 구현 프로젝트에서 패스워드를 어떻게 데이터베이스에 저장할까를 고민하다가 아래 글들을 통해 는 반드시 단방향 해시함수를 사용해 암호화 되어야한다는 것을 알게 되었고,  어떻게 안전하게 패스워드를 저장하게 되는지 개념을 알게되었다.

 

https://github.com/hsh2001/kor-law-for-dev/commit/c162a1e783f796ac4d1dc68871cfec4a92e5c3f3-패스워드 암호화법

 

Update 비밀번호_암호화.md · hsh2001/kor-law-for-dev@c162a1e

 

github.com

https://d2.naver.com/helloworld/318732 - 안전하게 패스워드를 저장하는법

 

솔트는 단방향 해시함수에서 해싱하고자 하는 문자열에 더해지는 바이트 단위의 임의의 문자열이다. 이 솔트를 문자열에 더하고 다이제스트(Digest)를 생성하는 것을 솔팅한다고 한다. (Digest는 해시함수에 의해 만들어진 해시 값을 뜻한다.) 이렇게 하면 기존에 패스워드를 그대로 해싱하는 것보다 훨씬 안전하다.

 

키 스트레칭은 단순하게 해싱된 다이제스트를 여러번 반복하여 해싱하는 것을 뜻한다. 이를 통해 브루트 포스 공격(조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법)에서 시간을 지연시켜 해킹을 방지할 수 있다.

 

이러한 기능을 하는 Adaptive Key Derivation Function 중 나는 프로젝트에 bcrypt 함수를 통해 구현하고자 한다. 일단 조만간 공부할 예정인 Spring Security 기본적으로 bcrypt를 권장하는 것 같다.(기본 설정이 Bcrypt로 되어있음) 그리고 요즘 가장 많이 쓰이고 PBKDF2보다 안전하다고 한다. 이에 대한 자세한 내용은 Spring Security를 공부하면서 해볼 것 같다.

 

 

 

프로그래머스 코딩테스트 연습문제 - 소수 찾기

https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

import java.util.*;

class Solution {
    public int solution(int n) {
        boolean[] isPrimeArray = new boolean[n+1];
        Arrays.fill(isPrimeArray,true);
        isPrimeArray[0] = false;
        isPrimeArray[1] = false;

        for(int i = 2;i*i <= n;i++){
            if(isPrimeArray[i]){
                for(int j = i*i;j <= n;j+=i){
                    isPrimeArray[j] = false;
                }
            }
        }
        return getPrimeNumber(isPrimeArray);
    }

    private int getPrimeNumber(boolean[] isPrimeArray) {
        int number =0;
        for (boolean isPrime : isPrimeArray) {
            number += isPrime ? 1 : 0;
        }
        return number;
    }
}

에라토스테네스의 체 알고리즘으로 일정 구간안에 소수의 개수를 찾는데 특화된 알고리즘이다. 계속까먹어서 기억하자는 의미에서 업로드 한다.

 

결론 및 느낀 점

Post 요청을 보낼 때 Location 헤더에 식별자를 넣어서 보내주는 이유가 궁금했는데 이를 리다이렉션에 활용하여 클라이언트의 요청을 안전하게 처리할 수 있다는 것이 신기했다.(PRG 개념)

 

그리고 HTTP와 스프링을 공부하면서 며칠전에 막연하게 느껴지던 로그인/회원가입 프로젝트가 점점 뚜렷해지는 것 같아서 뿌듯했다. 정말 짧은시간이었지만 꾸준히 공부한 것이 역시 답이었나보다. 지금까지처럼 앞으로도 조급해하지 말고 매일매일 단단하게 나아가야겠다.